Поскольку я работаю над очень большим набором данных, мне нужно нарезать набор данных группами, чтобы продолжить мои вычисления.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")
Это изящное решение, если вы хотите использовать дополнительный пакет :) Я буду обязательно поставить 'purrr' в моем списке пакетов-на-выезда. – AlexR