如何解决dplyr为什么无法汇总我的数据?
我正在将数据框df0
与地理对象合并。以前,我使用dplyr
在我的地理数据中添加了感兴趣的列,为此,我使用了[here] [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]:Merging a Shapefile and a dataframe
[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,1,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
中。经过仔细研究后,由于某些原因,我意识到每个国家/地区名称后都有一个空格。因此,只需应用以下代码即可保存我的代码:
df0 $ Country
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。