【问题标题】:Make a list element of each group with dplyr's group_by function使用 dplyr 的 group_by 函数制作每个组的列表元素
【发布时间】:2016-03-06 03:41:21
【问题描述】:

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

【问题讨论】:

  • 将library(sp) 添加为脚本的顶部对于看不到标签的人会很有用!

标签: r gis dplyr sp


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2020-02-22
    • 1970-01-01
    • 2016-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多