为什么 dplyr 无法汇总我的数据?
Why does dplyr fail to aggregate my data?
我正在努力将数据框 df0
与地理对象合并。以前,我使用 dplyr
向我的地理数据添加感兴趣的列,为此我使用了 [此处][1] 建议的方法。它适用于我的大数据集,但我一直在尝试对更简单的数据使用相同的方法,但我无法复制。这是问题的概述。
df0
是一个包含两列的 list
:“国家/地区”和“PF”。它看起来像这样:
Country PF
1 Afghanistan 3
2 Albania 3
3 Algeria 3
4 American Samoa 0
5 Andorra 3
6 Angola 3
7 Anguilla 0
8 Antigua & Barbuda 0
9 Argentina 1
10 Armenia 3
11 Aruba 0
- 地理对象使用
rnaturalearth
包定义如下:
library(rnaturalearth)
library(rnaturalearthdata)
world <- ne_countries(scale = "medium", returnclass = "sf")
world$Country<-noquote(world$name)
这是结果 world$Country
的样子:
1] Aruba Afghanistan Angola
[4] Anguilla Albania Aland
[7] Andorra United Arab Emirates Argentina
[10] Armenia American Samoa Antarctica
[13] Ashmore and Cartier Is. Fr. S. Antarctic Lands Antigua and Barb.
[16] Australia Austria Azerbaijan
[19] Burundi Belgium Benin
[22] Burkina Faso Bangladesh Bulgaria
想法是将列“PF”关联到对象 world
。为此,我使用了一段代码:
library(dplyr)
df_sum <- df0%>%
filter(Country %in% world$Country) %>%
group_by(Country) %>%
summarise(PF= mean(PF))
world$PF<- df_sum$PF[match(world$Country, df_sum$Country)]
通常情况下,这样就可以了。但是,由于某种原因,这次它不起作用。我注意到对象 df_sum
在 运行 代码之后包含零个观察值,这意味着代码的第一部分是失败的部分。作为一名业余程序员,我觉得我可能缺少一些非常基本的概念。你能帮帮我吗?
根据提供的答案进行编辑
确实我怀疑问题出在df0
。我是这样对待它的:
df0<-read.csv("C:/Users/public_funding.csv",sep=",")
df0$X<-NULL
colnames(df0)<-c("Country","PF")
#df0$Country<-levels(droplevels(df0$Country))
#df0$Country<-unlist(df0$Country)
head(df0)
nrow(df0)
数据如下所示:
[![df0$Country
][2]][2]
[![df0$Country
][3]][3]
我认为我的问题是由图像中可以看到的列表结构产生的。这就是为什么您可以在我的代码中看到我尝试同时使用 df0$Country<-levels(droplevels(df0$Country))
和 df0$Country<-unlist(df0$Country)
,但它们不起作用的原因。
[1]:
[2]: https://i.stack.imgur.com/cBva8.png
[3]: https://i.stack.imgur.com/QYz2N.png
我重新创建了 df0
、运行 您的其余代码,对我来说效果很好:
library(rnaturalearth)
library(rnaturalearthdata)
library(rgeos)
library(dplyr)
df0 <- data.frame(Country = c("Afghanistan", "Albania", "Algeria", "American Samoa",
"Andorra", "Angola", "Anguilla", "Antigua & Barbuda",
"Argentina", "Armenia", "Aruba"),
PF = c(3,3,3,0,3,3,0,0,1,3,0), stringsAsFactors = FALSE)
world <- ne_countries(scale = "medium", returnclass = "sf")
world$Country<-noquote(world$name)
df_sum <- df0 %>%
filter(Country %in% world$Country) %>%
group_by(Country) %>%
summarise(PF= mean(PF))
world$PF<- df_sum$PF[match(world$Country, df_sum$Country)]
> world$PF
[1] 0 3 3 0 3 NA 3 NA 1 3 0 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
[35] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA 3 NA NA NA NA NA
[69] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
[103] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
[137] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
[171] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
[205] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
[239] NA NA NA
> df_sum
# A tibble: 10 x 2
Country PF
<chr> <dbl>
1 Afghanistan 3
2 Albania 3
3 Algeria 3
4 American Samoa 0
5 Andorra 3
6 Angola 3
7 Anguilla 0
8 Argentina 1
9 Armenia 3
10 Aruba 0
既然你说 df_sum
在 运行 代码之后包含零观察值,我想知道这是否是 df0
的问题。尝试像我一样从头开始重新创建 df0
,如果你得到相同的输出,问题可能出在你如何拉动 df0
.
原来问题确实出在df0
。仔细查看后,我意识到由于某些原因,每个国家/地区名称后面都有一个空白 space 。所以我的代码是通过简单地应用保存的:
df0$Country<-trimws(df0$Country, "r")
我正在努力将数据框 df0
与地理对象合并。以前,我使用 dplyr
向我的地理数据添加感兴趣的列,为此我使用了 [此处][1] 建议的方法。它适用于我的大数据集,但我一直在尝试对更简单的数据使用相同的方法,但我无法复制。这是问题的概述。
df0
是一个包含两列的list
:“国家/地区”和“PF”。它看起来像这样:
Country PF
1 Afghanistan 3
2 Albania 3
3 Algeria 3
4 American Samoa 0
5 Andorra 3
6 Angola 3
7 Anguilla 0
8 Antigua & Barbuda 0
9 Argentina 1
10 Armenia 3
11 Aruba 0
- 地理对象使用
rnaturalearth
包定义如下:
library(rnaturalearth)
library(rnaturalearthdata)
world <- ne_countries(scale = "medium", returnclass = "sf")
world$Country<-noquote(world$name)
这是结果 world$Country
的样子:
1] Aruba Afghanistan Angola
[4] Anguilla Albania Aland
[7] Andorra United Arab Emirates Argentina
[10] Armenia American Samoa Antarctica
[13] Ashmore and Cartier Is. Fr. S. Antarctic Lands Antigua and Barb.
[16] Australia Austria Azerbaijan
[19] Burundi Belgium Benin
[22] Burkina Faso Bangladesh Bulgaria
想法是将列“PF”关联到对象 world
。为此,我使用了一段代码:
library(dplyr)
df_sum <- df0%>%
filter(Country %in% world$Country) %>%
group_by(Country) %>%
summarise(PF= mean(PF))
world$PF<- df_sum$PF[match(world$Country, df_sum$Country)]
通常情况下,这样就可以了。但是,由于某种原因,这次它不起作用。我注意到对象 df_sum
在 运行 代码之后包含零个观察值,这意味着代码的第一部分是失败的部分。作为一名业余程序员,我觉得我可能缺少一些非常基本的概念。你能帮帮我吗?
根据提供的答案进行编辑
确实我怀疑问题出在df0
。我是这样对待它的:
df0<-read.csv("C:/Users/public_funding.csv",sep=",")
df0$X<-NULL
colnames(df0)<-c("Country","PF")
#df0$Country<-levels(droplevels(df0$Country))
#df0$Country<-unlist(df0$Country)
head(df0)
nrow(df0)
数据如下所示:
[![df0$Country
][2]][2]
[![df0$Country
][3]][3]
我认为我的问题是由图像中可以看到的列表结构产生的。这就是为什么您可以在我的代码中看到我尝试同时使用 df0$Country<-levels(droplevels(df0$Country))
和 df0$Country<-unlist(df0$Country)
,但它们不起作用的原因。
[1]:
我重新创建了 df0
、运行 您的其余代码,对我来说效果很好:
library(rnaturalearth)
library(rnaturalearthdata)
library(rgeos)
library(dplyr)
df0 <- data.frame(Country = c("Afghanistan", "Albania", "Algeria", "American Samoa",
"Andorra", "Angola", "Anguilla", "Antigua & Barbuda",
"Argentina", "Armenia", "Aruba"),
PF = c(3,3,3,0,3,3,0,0,1,3,0), stringsAsFactors = FALSE)
world <- ne_countries(scale = "medium", returnclass = "sf")
world$Country<-noquote(world$name)
df_sum <- df0 %>%
filter(Country %in% world$Country) %>%
group_by(Country) %>%
summarise(PF= mean(PF))
world$PF<- df_sum$PF[match(world$Country, df_sum$Country)]
> world$PF
[1] 0 3 3 0 3 NA 3 NA 1 3 0 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
[35] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA 3 NA NA NA NA NA
[69] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
[103] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
[137] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
[171] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
[205] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
[239] NA NA NA
> df_sum
# A tibble: 10 x 2
Country PF
<chr> <dbl>
1 Afghanistan 3
2 Albania 3
3 Algeria 3
4 American Samoa 0
5 Andorra 3
6 Angola 3
7 Anguilla 0
8 Argentina 1
9 Armenia 3
10 Aruba 0
既然你说 df_sum
在 运行 代码之后包含零观察值,我想知道这是否是 df0
的问题。尝试像我一样从头开始重新创建 df0
,如果你得到相同的输出,问题可能出在你如何拉动 df0
.
原来问题确实出在df0
。仔细查看后,我意识到由于某些原因,每个国家/地区名称后面都有一个空白 space 。所以我的代码是通过简单地应用保存的:
df0$Country<-trimws(df0$Country, "r")