2015-12-02 7 views
1

Я хотел бы иметь возможность использовать больше автоматизации при создании объектов SpatialLines из других аккуратных кадров данных.Сделать элемент списка каждой группы с помощью функции group_by dplyr

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 бы сделать процесс довольно легко, если вы могли бы понять, каким образом эти данные могут быть переданы в список.

+2

Было бы полезно добавить 'библиотеку (SP)' в верхней части сценария, для людей, которые не видят тег! – Nelson

ответ

2

Использование данных образцов, функцию обертку, и 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 так что может быть лучше, чтобы присвоить идентификаторы.

Для справки, рассмотрит чтение Hadley's comments по возвращению не-dataframe из dplyr do звонков

Смежные вопросы