我有一个数据框,其中包含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
我想将空间数据与有趣的数据合并。
答案 0 :(得分:1)
此处您可以在'\0'
或更新的split
中使用基数R的拆分功能。这将根据拆分变量分离数据帧,您可以dplyr::group_split
或lapply
使用诸如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
函数,我认为它的功能与我上面所做的类似。但无需您自己拆分。