Я хочу разделить кадр данных на несколько меньших. Это похоже на очень тривиальный вопрос, однако я не могу найти решение от веб-поиска.
Вы также можете захотеть разрезать фрейм данных на произвольное количество меньших фреймов данных. Здесь мы разрезаем на два фрейма данных.
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
Вы также можете разделить фрейм данных на основе существующего столбца. Например, чтобы создать три фрейма данных на основе столбца cyl
в mtcars
:
split(mtcars,mtcars$cyl)
Нужный вам ответ во многом зависит от того, как и зачем вы хотите разбить кадр данных.
Например, если вы хотите исключить некоторые переменные, вы можете создать новые рамки данных из определенных столбцов базы данных. Подписи в скобках после рамки данных означают номера строк и столбцов. Полное описание смотрите в Spoetry.
newdf <- mydf[,1:3]
Или вы можете выбрать определенные строки.
newdf <- mydf[1:3,]
И эти подзаписи также могут быть логическими тестами, например, выбрать строки, содержащие определенное значение, или коэффициенты с желаемым значением.
Что вы хотите сделать с оставшимися кусками? Нужно ли вам выполнить одну и ту же операцию над каждым куском базы данных? Тогда вам нужно обеспечить, чтобы подмножества блока данных оказались в удобном объекте, таком как список, который поможет вам выполнить одну и ту же команду над каждым блоком блока данных.
subset ()
также полезно:
subset(DATAFRAME, COLUMNNAME == "")
Для пакета обзора, может быть, уместен пакет survey
?
Если вы хотите разделить фрейм данных в соответствии со значениями какой-либо переменной, я бы предложил использовать daply ()
из пакета plyr
.
library(plyr)
x <- daply(df, .(splitting_variable), function(x)return(x))
Теперь x
- это массив фреймов данных. Чтобы получить доступ к одному из фреймов данных, вы можете проиндексировать его по имени уровня переменной разделения.
x$Level1
#or
x[["Level1"]]
Я был бы уверен, что нет других более умных способов справиться с вашими данными, прежде чем разбивать их на множество фреймов данных.
Я только что опубликовал что-то вроде 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
Спасибо, Себастьян