【问题标题】:Why does dplyr fail to aggregate my data?为什么 dplyr 无法聚合我的数据?
【发布时间】:2020-09-24 17:24:54
【问题描述】:

我正在将数据框df0 与地理对象合并。以前,我使用dplyr 将感兴趣的列添加到我的地理数据中,为此我使用了[此处][1] 建议的方法。它适用于我的大数据集,但是我一直在尝试对更简单的数据使用相同的方法,但我无法复制。这是问题的概述。

  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
  1. 地理对象使用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&lt;-levels(droplevels(df0$Country))df0$Country&lt;-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 %&gt;% filter(Country %in% world$Country),检查你是否还有任何行
  • 确实在运行那段代码后,我的观察结果为零!您认为什么会导致过滤器损坏?
  • 请提供示例数据dput(df0)

标签: r dplyr merge geolocation geospatial


【解决方案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

【讨论】:

  • my sessionInfo(): R 版本 3.5.3 (2019-03-11) 平台:x86_64-w64-mingw32/x64 (64-bit) 运行条件:Windows >= 8 x64 (build 9200) )
  • 非常感谢您的回复!添加评论以进一步解释我的 df0 的结构。
  • 你有点迷失我了。您能否提供一个屏幕截图,或者更好的是,一些输出显示您使用df0&lt;-read.csv("C:/Users/public_funding.csv",sep=",") 读入后的df0 的样子?
  • @yung_febreze 请不要要求截图,但是对于dput(df0)(或dput(head(df0)))的输出,这使得调试更容易:)
  • 解决了,答案会让你生气。不过还是非常感谢两位的帮助! :)
【解决方案2】:

原来问题确实出在df0。仔细阅读后,我意识到由于某些原因,每个国家/地区名称后面都有一个空格。所以我的代码通过简单的应用保存了:

df0$Country

【讨论】:

    猜你喜欢
    • 2022-12-03
    • 2016-12-02
    • 2019-09-03
    • 1970-01-01
    • 1970-01-01
    • 2019-11-19
    • 2022-11-16
    • 1970-01-01
    • 2022-01-19
    相关资源
    最近更新 更多