使用 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
调用返回非数据帧
我希望在从整洁的数据框创建 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
调用返回非数据帧