2016-08-11 7 views
2

Поскольку я работаю над очень большим набором данных, мне нужно нарезать набор данных группами, чтобы продолжить мои вычисления.R - как избежать повторения фильтра и привязки строк

У меня есть человек-период (melt) набор данных, который выглядит следующим образом

group id var time 
1  A 1 a 1 
2  A 1 b 2 
3  A 1 a 3 
4  A 2 b 1 
5  A 2 b 2 
6  A 2 b 3 
7  B 1 a 1 
8  B 1 a 2 
9  B 1 a 3 
10  B 2 c 1 
11  B 2 c 2 
12  B 2 c 3 

Мне нужно сделать это простое преобразование

library(reshape2) 
library(dplyr) 

dt %>% dcast(group + id ~ time, value.var = 'var') 

Для того, чтобы получить

group id 1 2 3 
1  A 1 a b a 
2  A 2 b b b 
3  B 1 a a a 
4  B 2 c c c 

Все идет нормально.

Однако, поскольку моя база данных слишком велик, мне нужно сделать это отдельно для каждого различных групп, таких как

a = dt %>% filter(group == 'A') %>% dcast(group + id ~ time, value.var ='var') 
b = dt %>% filter(group == 'B') %>% dcast(group + id ~ time, value.var = 'var') 

bind_rows(a,b) 

Моя проблема заключается в том, что я хотел бы избежать делать это вручную. Я имею в виду, что нужно отдельно хранить каждую группу, a = ..., b = ..., c = ..., and so on

Любая идея, как я мог бы создать поток pipe, который будет разделять каждую группу, вычислять преобразование и объединять его в кадре данных?

dt = structure(list(group = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 2L, 
2L, 2L, 2L, 2L, 2L), .Label = c("A", "B"), class = "factor"), 
id = structure(c(1L, 1L, 1L, 2L, 2L, 2L, 1L, 1L, 1L, 2L, 2L, 2L), .Label = c("1", "2"), class = "factor"), var = structure(c(1L, 
2L, 1L, 2L, 2L, 2L, 1L, 1L, 1L, 3L, 3L, 3L), .Label = c("a", 
"b", "c"), class = "factor"), time = structure(c(1L, 2L, 
3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L), .Label = c("1", 
"2", "3"), class = "factor")), .Names = c("group", "id", 
"var", "time"), row.names = c(NA, -12L), class = "data.frame") 

ответ

3

Пакет purrr может быть полезно для работы со списками. Сначала разделите набор данных по группам, а затем используйте map_df в dcast в каждом списке, но верните все в единый файл data.frame.

library(purrr) 

dt %>% 
    split(.$group) %>% 
    map_df(~dcast(.x, group + id ~ time, value.var = "var")) 

    group id 1 2 3 
1  A 1 a b a 
2  A 2 b b b 
3  B 1 a a a 
4  B 2 c c c 
+0

Это изящное решение, если вы хотите использовать дополнительный пакет :) Я буду обязательно поставить 'purrr' в моем списке пакетов-на-выезда. – AlexR

2

lapply ваш друг здесь:

do.call(rbind, lapply(unique(dt$Group), function(grp, dt){ 
    dt %>% filter(Group == grp) %>% dcast(group + id ~ time, value.var = "var") 
}, dt = dt)) 

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

  • Нет связанных вопросов^_^