У меня есть фрейм данных с 10 столбцами, собирающими действия «пользователей», где один из столбцов содержит идентификатор (не уникальный, идентифицирующий пользователя) (столбец 10). длина кадра данных составляет около 750000 строк. Я пытаюсь извлечь отдельные фреймы данных (чтобы получить список или вектор фреймов данных), разделенные по столбцу, содержащему идентификатор «пользователя», чтобы изолировать действия одного субъекта.
ID | Data1 | Data2 | ... | UserID
1 | aaa | bbb | ... | u_001
2 | aab | bb2 | ... | u_001
3 | aac | bb3 | ... | u_001
4 | aad | bb4 | ... | u_002
в результате
list(
ID | Data1 | Data2 | ... | UserID
1 | aaa | bbb | ... | u_001
2 | aab | bb2 | ... | u_001
3 | aac | bb3 | ... | u_001
,
4 | aad | bb4 | ... | u_002
...)
Для меня очень хорошо работает на небольшой выборке (1000 строк):
paths = by(smallsampleMat, smallsampleMat[,"userID"], function(x) x)
а затем получить доступ к нужному мне элементу, например, по путям [1].
При применении к исходному большому фрейму данных или даже к матричному представлению это заглушает мою машину (4 ГБ ОЗУ, MacOSX 10.6, R 2.15) и никогда не завершается (я знаю, что существует более новая версия R, но я считаю, что это не основная проблема ).
Кажется, что разделение более производительно и после долгого завершения, но я не знаю (хуже знания R), как разделить полученный список векторов на вектор матриц.
path = split(smallsampleMat, smallsampleMat[,10])
Я также рассматривал возможность использования и big.matrix
т. Д., Но без особого успеха, который ускорил бы процесс.
dlply(df, .(userid))
узнать о производительности, и я обнаружил, что это плохо по сравнению сsplit
даже без включения времени выполненияrequire(plyr)
, спасибо и OP!Начиная с версии 0.8.0,
dplyr
предлагает удобную функцию, которая называетсяgroup_split()
:# On sample data from @Aus_10 df %>% group_split(g) [[1]] # A tibble: 25 x 3 ran_data1 ran_data2 g <dbl> <dbl> <fct> 1 2.04 0.627 A 2 0.530 -0.703 A 3 -0.475 0.541 A 4 1.20 -0.565 A 5 -0.380 -0.126 A 6 1.25 -1.69 A 7 -0.153 -1.02 A 8 1.52 -0.520 A 9 0.905 -0.976 A 10 0.517 -0.535 A # … with 15 more rows [[2]] # A tibble: 25 x 3 ran_data1 ran_data2 g <dbl> <dbl> <fct> 1 1.61 0.858 B 2 1.05 -1.25 B 3 -0.440 -0.506 B 4 -1.17 1.81 B 5 1.47 -1.60 B 6 -0.682 -0.726 B 7 -2.21 0.282 B 8 -0.499 0.591 B 9 0.711 -1.21 B 10 0.705 0.960 B # … with 15 more rows
Чтобы не включать столбец группировки:
df %>% group_split(g, keep = FALSE)
источник
Наткнулся на этот ответ, и мне действительно нужны ОБЕ группы (данные, содержащие этого одного пользователя, и данные, содержащие все, кроме этого одного пользователя). Необязательно из-за специфики этого поста, но я подумал, что добавлю, если кто-то искал в Google ту же проблему, что и я.
df <- data.frame( ran_data1=rnorm(125), ran_data2=rnorm(125), g=rep(factor(LETTERS[1:5]), 25) ) test_x = split(df,df$g)[['A']] test_y = split(df,df$g!='A')[['TRUE']]
Вот как это выглядит:
head(test_x) x y g 1 1.1362198 1.2969541 A 6 0.5510307 -0.2512449 A 11 0.0321679 0.2358821 A 16 0.4734277 -1.2889081 A 21 -1.2686151 0.2524744 A > head(test_y) x y g 2 -2.23477293 1.1514810 B 3 -0.46958938 -1.7434205 C 4 0.07365603 0.1111419 D 5 -1.08758355 0.4727281 E 7 0.28448637 -1.5124336 B 8 1.24117504 0.4928257 C
источник