我希望能够在从其他整洁的数据框创建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这样的过程非常简单。
答案 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