使用dplyr的group_by函数创建每个组的列表元素

时间:2015-12-02 01:51:31

标签: r gis dplyr sp

我希望能够在从其他整洁的数据框创建SpatialLines对象时使用更多自动化。

library(sp)
#create sample data
sample_data <- data.frame(group_id = rep(c("a", "b","c"), 10),
                          x = rnorm(10), 
                          y = rnorm(10))

#How can I recreate this using dplyr?
a_list <- Lines(list(Line(sample_data %>% filter(group_id == "a") %>% select(x, y))), ID = 1)
b_list <- Lines(Line(list(sample_data %>% filter(group_id == "b") %>% select(x, y))), ID = 2)
c_list <- Lines(Line(list(sample_data %>% filter(group_id == "c") %>% select(x, y))), ID = 3)
SpatialLines(list(a_list, b_list, c_list))

如果您能够理解数据如何通过管道传输到列表中,您可以看到如何使用group_by这样的过程非常简单。

1 个答案:

答案 0 :(得分:3)

使用您的示例数据,包装函数和dplyr::do将为您提供所需的内容:)

wrapper <- function(df) {
  df  %>% select(x,y) %>% as.data.frame %>% Line %>% list %>% return
  }

 y <-  sample_data %>% group_by(group_id) %>%
  do(res = wrapper(.)) 

 # and now assign IDs (since we can't do that inside dplyr easily)
 ids = 1:dim(y)[1]
 SpatialLines(
   mapply(x = y$res, ids = ids, FUN = function(x,ids) {Lines(x,ID=ids)})
 )

我不使用sp,因此可能有更好的方法来分配ID。

供参考,请考虑阅读有关从dplyr do电话中返回非数据帧的Hadley's comments