r - 我可以用 R 中的提示功能制作世界地图吗?
问题描述
我是编程新手,我偶然发现了一些我无法解决的问题,我希望你们能解决。
我正在使用 FIFA 19 数据集。请参阅下面的数据集的一部分:
Name Nationality Overall Club Balance
1 L. Messi Argentina 94 FC Barcelona 95
2 Cristiano Ronaldo Portugal 94 Juventus 70
3 Neymar Jr Brazil 92 Paris Saint-Germain 84
4 De Gea Spain 91 Manchester United 43
5 K. De Bruyne Belgium 91 Manchester City 77
6 E. Hazard Belgium 91 Chelsea 94
我想要的是一张世界地图,您可以在其中插入带有 readline(prompt) 功能的俱乐部,然后为您提供该俱乐部的所有球员的地图,然后显示这些球员来自世界的哪个地方(所以计数每个俱乐部的每个国籍,如果有道理的话)。
我在以下网站上看到了如何制作这个数据集的世界地图。
制作总玩家人数的世界地图(因此对于整个数据集)的代码如下。它给了我正确的输出。
overall_data <- fifa %>%
group_by(Nationality) %>%
summarise(Count = n(),
Avg_Overall = mean(Overall),
Avg_Potential = mean(Potential),
Avg_Pot_Diff = mean(Potential-Overall))
worldmap = map_data("world")
merged_data <- merge(x = worldmap, y = overall_data, by.x = "region", by.y = "Nationality", all.x = TRUE) %>% arrange(order)
ggplot(data = merged_data, aes(x = long, y = lat, group = group)) +
geom_polygon(aes(fill = Count)) +
labs(fill='Total Player Counts')
即,这个世界地图: Worldmap Total Player Count
但这不允许我为每个俱乐部制作不同的地图。所以我制作了一个单独的数据文件,记录每个俱乐部,每个国家有多少人。我使用来自此来源的 crosstab() 函数制作了一个交叉表:(“http://pcwww.liv.ac.uk/~william/R/crosstab.r”)。这是我使用的代码:
nat_per_club <- crosstab(fifa, row.vars = "Nationality", col.vars = "Club", type ="f")
nat_per_club_crosstab <- nat_per_club$crosstab
nat_per_club_dataframe <- data.frame(nat_per_club_crosstab)
nat_per_club_dataframe <- nat_per_club_dataframe[!(nat_per_club_dataframe$Freq==0), ]
这给了我下表:
Nationality Club Freq
8 Armenia SSV Jahn Regensburg 1
60 Germany SSV Jahn Regensburg 19
87 Kosovo SSV Jahn Regensburg 1
94 Lithuania SSV Jahn Regensburg 1
104 Morocco SSV Jahn Regensburg 1
121 Poland SSV Jahn Regensburg 1
这正是我想要的,因为它显示了每个俱乐部和每个国家的频率。现在的问题是,如何使用 readline(prompt) 函数在世界地图中实现它。因此,如果我插入例如 SSV Jahn Regensburg,它会向我显示他们的球员来自世界哪个地方的世界地图?
这是我尝试过的,但不幸的是它不起作用。
worldmap2 = map_data("world")
merged_data2 <- merge(x = worldmap2, y = nat_per_club_dataframe, by.x = "region", by.y = "Nationality", all.x = TRUE) %>% arrange(order)
ggplot(data = merged_data2, aes(x = long, y = lat, group = group)) +
geom_polygon(aes(fill = Freq)) +
labs(fill='Total Player Count')
players_from_where <- function() {
club_name <- as.character(readline(prompt="Club: "))
for(i in 1:nrow(nat_per_club_dataframe)){
if(nat_per_club_dataframe[i, "Club"] == club_name){
ggplot(data = merged_data2, aes(x = long, y = lat, group = group)) +
geom_polygon(aes(fill = Freq)) +
labs(fill='Total Player Counts')
}
}
}
我希望有人能帮帮忙!
解决方案
不需要for
循环。dplyr::filter
您可以简单地使用或为输入的俱乐部名称过滤聚合数据集subset
,将其合并到地图数据并绘制。
library(tidyverse)
players_from_where <- function(club_name) {
x <- filter(nat_per_club_dataframe, Club %in% club_name)
worldmap <- map_data("world")
merged_data2 <- merge(x = worldmap, y = x, by.x = "region", by.y = "Nationality", all.x = TRUE) %>%
arrange(order)
ggplot(data = merged_data2, aes(x = long, y = lat, group = group)) +
geom_polygon(aes(fill = n)) +
labs(fill = "Total Player Counts")
}
# club_name <- as.character(readline(prompt = "Club: "))
club_name <- "FC Barcelona"
players_from_where(club_name)
数据
nat_per_club_dataframe <- structure(list(Nationality = c(
"Argentina", "Belgium", "Brazil",
"Chile", "Croatia", "France", "Germany", "Netherlands", "Portugal",
"Senegal", "Spain", "Uruguay", "Austria", "Brazil", "Colombia",
"France", "Germany", "Netherlands", "Poland", "Portugal", "Spain"
), Club = c(
"FC Barcelona", "FC Barcelona", "FC Barcelona", "FC Barcelona",
"FC Barcelona", "FC Barcelona", "FC Barcelona", "FC Barcelona",
"FC Barcelona", "FC Barcelona", "FC Barcelona", "FC Barcelona",
"FC Bayern München", "FC Bayern München", "FC Bayern München",
"FC Bayern München", "FC Bayern München", "FC Bayern München",
"FC Bayern München", "FC Bayern München", "FC Bayern München"
), n = c(
1L, 1L, 4L, 1L, 1L, 3L, 1L, 1L, 1L, 1L, 17L, 1L, 1L,
1L, 1L, 3L, 18L, 1L, 1L, 1L, 2L
)), class = "data.frame", row.names = c(
NA,
-21L
))
推荐阅读
- javascript - 在 JavaScript 中为控制台日志覆盖数组的字符串表示
- javascript - 以编程方式控制画笔并传递相关信息
- react-native - 复杂的 React 导航状态
- prolog - Prolog - 在列表中查找最小元素
- python - 正则表达式在 regex101 上工作,但不在 Python 中
- html - CSS Grid - 2x2 网格总是尽可能占据整个宽度
- python - 在 Python 循环中调整迭代量
- c - 为 A* 搜索算法创建过滤器
- docker - 将文件传递给 docker run 的最佳方法
- python - 凯撒密码的蛮力方法对我不起作用