使用sp :: merge()作为函数来拆分R中应用和合并的更好方法

时间:2019-05-02 22:05:05

标签: r dplyr sp

我有一个数据框,其中包含3106个美国县中每个县的500个观测值。我想将该数据框与SpatialPolygonsDataFrame合并。

我尝试了几种方法。我发现,如果我通过变量iter_id过滤数据,则可以使用sp::merge()合并数据集。我想我可以再rbind将它们放在一起。 sp::merge()不允许进行右连接或完全连接,并且空间数据必须位于左位置。所以多对一的行不通。我尝试过的真正讨厌的方法是: (我不确定如何在此处用感兴趣的变量表示数据框)

library(choroplethr)
data(continental_us_states)
us <- tigris::counties(continental_us_states)

gm_y_corr <- tribble(~GEOID,~iter_id,~neat_variable,
01001,1,"value_1",
01003,1,"value_2",
...
01001,2,"value_3",
01003,2,"value_4",
...
01001,500,"value_5",
01003,500,"value_6")

filtered <- gm_y_corr %>%
  filter(iter_id ==1)

us.gm <- sp::merge(us, filtered ,by='GEOID')

for (j in 2:500) {
tmp2 <- gm_y_corr %>%
  filter(iter_id == j)
tmp3 <- sp::merge(us, tmp2,by='GEOID')
us.gm <- rbind(us.gm,tmp3)
}

我知道必须有更好的方法。我已经尝试过group_by。但是找到了多个匹配项。因此,我一定不能理解group_by

> geo_dat <- gm_y_corr %>%
+   group_by(iter_id)%>%
+   sp::merge(us, .,by='GEOID')
Error in .local(x, y, ...) : non-unique matches detected

我想将空间数据与有趣的数据合并。

1 个答案:

答案 0 :(得分:1)

此处您可以在'\0'或更新的split中使用基数R的拆分功能。这将根据拆分变量分离数据帧,您可以dplyr::group_splitlapply使用诸如purrr::map之类的函数,然后merge将返回的列表折叠到dplyr::bind_rows。由于我无法获取dataframe数据,因此我只写了我认为可以使用的数据。

us

等效地,这与使用base R功能相同。我认为新的gm_y_corr %>% group_by(iter_id) %>% # group group_split() %>% # split lapply(., function(x){ # apply function(x) merge(us, x, by = "GEOID") to leach list element merge(us, x, by = "GEOID") }) %>% bind_rows() # collapse to data frame 更加直观。

group_by %>% group_split

如果您只想使用gm_y_corr %>% split(.$iter_id) %>% lapply(., function(x){ merge(us, x, by = "GEOID") }) %>% bind_rows() ,则必须继续使用group_by函数,我认为它的功能与我上面所做的类似。但无需您自己拆分。