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

标签 r gis dplyr r-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 这样的东西会让这个过程变得非常容易。

最佳答案

使用示例数据、包装函数和 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来电

关于r - 使用 dplyr 的 group_by 函数制作每个组的列表元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34033583/

相关文章:

r - 从 R 控制台执行批处理文件 (psexec.exe)

python - Numpy python R 等效索引

r - 观星者选项 : resizebox and label

R:带有冒号运算符和空向量长度的 For 循环

r - 从 rstudio 中的 shapefile 绘制图层的难度

c# - 从 C#/.NET 使用 GDAL 时出现 "No Disk"错误

java - 地理工具,Java : How to convert shapefile data from DOR to usable polygons with Latitude and Longitude coordinates

如果子组的坐标在 r 中的另一个子组内,则删除组内的行

r - Dplyr 非等值连接不再接受 join_by 参数

r - 由于 NA 的原因,无法对数据帧进行子集化(过滤)