使用 dplyr 的 group_by 函数制作每个组的列表元素

Make a list element of each group with dplyr's group_by function

我希望在从整洁的数据框创建 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 之类的东西会如何使这个过程变得非常简单。

使用您的示例数据、包装函数和 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。

作为参考,考虑阅读 Hadley's comments 从 dplyr do 调用返回非数据帧