Как разбить фрейм данных?

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

Ответ 1

Вы также можете сократить кадр данных на произвольное число меньших кадров данных. Здесь мы разрезаем два кадра данных.

x = data.frame(num = 1:26, let = letters, LET = LETTERS)
set.seed(10)
split(x, sample(rep(1:2, 13)))

дает

$`1`
   num let LET
3    3   c   C
6    6   f   F
10  10   j   J
12  12   l   L
14  14   n   N
15  15   o   O
17  17   q   Q
18  18   r   R
20  20   t   T
21  21   u   U
22  22   v   V
23  23   w   W
26  26   z   Z

$`2`
   num let LET
1    1   a   A
2    2   b   B
4    4   d   D
5    5   e   E
7    7   g   G
8    8   h   H
9    9   i   I
11  11   k   K
13  13   m   M
16  16   p   P
19  19   s   S
24  24   x   X
25  25   y   Y

Ответ 2

Если вы хотите разделить фрейм данных в соответствии со значениями некоторой переменной, я бы предложил использовать daply() из пакета plyr.

library(plyr)
x <- daply(df, .(splitting_variable), function(x)return(x))

Теперь x представляет собой массив данных. Чтобы получить доступ к одному из данных, вы можете проиндексировать его с именем уровня разделительной переменной.

x$Level1
#or
x[["Level1"]]

Я был бы уверен, что нет других более умных способов иметь дело с вашими данными, прежде чем раскалывать их во многих файлах данных.

Ответ 3

Я только что разместил своего рода RFC, который может вам помочь: Разделить вектор на куски в R

x = data.frame(num = 1:26, let = letters, LET = LETTERS)
## number of chunks
n <- 2
dfchunk <- split(x, factor(sort(rank(row.names(x))%%n)))
dfchunk
$`0`
   num let LET
1    1   a   A
2    2   b   B
3    3   c   C
4    4   d   D
5    5   e   E
6    6   f   F
7    7   g   G
8    8   h   H
9    9   i   I
10  10   j   J
11  11   k   K
12  12   l   L
13  13   m   M

$`1`
   num let LET
14  14   n   N
15  15   o   O
16  16   p   P
17  17   q   Q
18  18   r   R
19  19   s   S
20  20   t   T
21  21   u   U
22  22   v   V
23  23   w   W
24  24   x   X
25  25   y   Y
26  26   z   Z

Cheers, Sebastian

Ответ 4

Вы также можете использовать

data2 <- data[data$sum_points == 2500, ]

Это сделает блок данных со значениями, где sum_points = 2500

Он дает:

airfoils sum_points field_points   init_t contour_t   field_t
...
491        5       2500         5625 0.000086  0.004272  6.321774
498        5       2500         5625 0.000087  0.004507  6.325083
504        5       2500         5625 0.000088  0.004370  6.336034
603        5        250        10000 0.000072  0.000525  1.111278
577        5        250        10000 0.000104  0.000559  1.111431
587        5        250        10000 0.000072  0.000528  1.111524
606        5        250        10000 0.000079  0.000538  1.111685
....
> data2 <- data[data$sum_points == 2500, ]
> data2
airfoils sum_points field_points   init_t contour_t   field_t
108        5       2500          625 0.000082  0.004329  0.733109
106        5       2500          625 0.000102  0.004564  0.733243
117        5       2500          625 0.000087  0.004321  0.733274
112        5       2500          625 0.000081  0.004428  0.733587

Ответ 5

Подмножество() также полезно

subset(DATAFRAME, COLUMNNAME == "")

Для пакета опроса может быть уместен пакет "опроса"?

http://faculty.washington.edu/tlumley/survey/

Ответ 6

Ответ, который вы хотите, очень сильно зависит от того, как и почему вы хотите разбить фрейм данных.

Например, если вы хотите оставить некоторые переменные, вы можете создавать новые кадры данных из определенных столбцов базы данных. Нижние индексы в скобках после кадра данных относятся к номерам строк и столбцов. Зайдите в Spoetry для полного описания.

newdf <- mydf[,1:3]

Или вы можете выбрать определенные строки.

newdf <- mydf[1:3,]

И эти индексы также могут быть логическими тестами, такими как выбор строк, содержащих определенное значение, или коэффициенты с требуемым значением.

Что вы хотите сделать с оставшимися кусками? Вам нужно выполнить одну и ту же операцию на каждом фрагменте базы данных? Затем вы захотите убедиться, что подмножества кадра данных попадут в удобный объект, например список, который поможет вам выполнить одну и ту же команду на каждом фрагменте кадра данных.

Ответ 7

Если вы хотите разбить по значениям в одном из столбцов, вы можете использовать lapply. Например, чтобы разделить ChickWeight на отдельный набор данных для каждого цыпленка:

data(ChickWeight)
lapply(unique(ChickWeight$Chick), function(x) ChickWeight[ChickWeight$Chick == x,])

Ответ 8

Разделение кадра данных кажется контрпродуктивным. Вместо этого используйте парадигму split-apply-comb, например, генерируйте некоторые данные

df = data.frame(grp=sample(letters, 100, TRUE), x=rnorm(100))

затем разделить только соответствующие столбцы и применить функцию scale() к x в каждой группе и объединить результаты (используя split<- или ave)

df$z = 0
split(df$z, df$grp) = lapply(split(df$x, df$grp), scale)
## alternative: df$z = ave(df$x, df$grp, FUN=scale)

Это будет очень быстро по сравнению с разбиением data.frames, и результат остается пригодным для последующего анализа без итерации. Я думаю, что синтаксис dplyr

library(dplyr)
df %>% group_by(grp) %>% mutate(z=scale(x))

В общем случае это решение dplyr быстрее, чем разделение кадров данных, но не так быстро, как split-apply-comb.