【发布时间】:2020-09-24 17:24:54
【问题描述】:
我正在将数据框df0 与地理对象合并。以前,我使用dplyr 将感兴趣的列添加到我的地理数据中,为此我使用了[此处][1] 建议的方法。它适用于我的大数据集,但是我一直在尝试对更简单的数据使用相同的方法,但我无法复制。这是问题的概述。
-
df0是一个list,它包含两列:“Country”和“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
【问题讨论】:
-
这听起来像你的
filter操作不正常;如果你只是做df0 %>% filter(Country %in% world$Country),检查你是否还有任何行 -
确实在运行那段代码后,我的观察结果为零!您认为什么会导致过滤器损坏?
-
请提供示例数据
dput(df0)
标签: r dplyr merge geolocation geospatial