81

我想将一个数据框拆分为几个较小的数据框。这看起来像一个非常微不足道的问题,但是我无法从网络搜索中找到解决方案。

4

8 回答 8

69

您可能还希望将数据帧切割成任意数量的较小数据帧。在这里,我们分成两个数据框。

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)
于 2010-07-21T18:47:24.510 回答
19

如果您想根据某个变量的值拆分数据框,我建议您daply()plyr包中使用。

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

现在,x是一组数据帧。要访问其中一个数据框,您可以使用拆分变量级别的名称对其进行索引。

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

我敢肯定,在将数据拆分为许多数据帧之前,没有其他更聪明的方法来处理您的数据。

于 2010-07-21T18:28:11.567 回答
14

你也可以使用

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
于 2011-07-28T13:30:43.660 回答
13

我刚刚发布了一种可能对您有所帮助的 RFC:Split a vector into chunks in 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

干杯,塞巴斯蒂安

于 2010-07-23T13:09:18.207 回答
7

subset()也很有用:

subset(DATAFRAME, COLUMNNAME == "")

对于调查包,也许该survey包是相关的?

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

于 2010-07-21T18:37:32.737 回答
6

您想要的答案在很大程度上取决于您要如何以及为什么要分解数据框。

例如,如果您想省略一些变量,您可以从数据库的特定列创建新的数据框。数据框后括号中的下标指的是行号和列号。查看 Spoery 以获得完整的描述。

newdf <- mydf[,1:3]

或者,您可以选择特定的行。

newdf <- mydf[1:3,]

并且这些下标也可以是逻辑测试,例如选择包含特定值的行,或者具有期望值的因子。

你想用剩下的块做什么?您是否需要对数据库的每个块执行相同的操作?然后,您需要确保数据框的子集以方便的对象(例如列表)结束,这将帮助您对数据框的每个块执行相同的命令。

于 2010-07-22T18:21:30.157 回答
3

如果要按其中一列中的值进行拆分,可以使用lapply. 例如,要ChickWeight为每个小鸡拆分成一个单独的数据集:

data(ChickWeight)
lapply(unique(ChickWeight$Chick), function(x) ChickWeight[ChickWeight$Chick == x,])
于 2015-01-20T01:30:46.063 回答
3

拆分数据框似乎适得其反。相反,使用拆分-应用-组合范式,例如,生成一些数据

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

然后只拆分相关的列并将scale()函数应用于每组中的 x ,并组合结果(使用split<-or 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 解决方案比拆分数据帧快,但不如拆分-应用-组合快。

于 2016-07-19T00:34:00.863 回答