如何拆分数据框?

时间:2010-07-21 18:08:03

标签: r split dataframe r-faq

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

8 个答案:

答案 0 :(得分:55)

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

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)

答案 1 :(得分:18)

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

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

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

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

我确信在将数据拆分为多个数据帧之前,没有其他更聪明的方法来处理数据。

答案 2 :(得分:12)

您也可以使用

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

答案 3 :(得分:11)

答案 4 :(得分:7)

subset()也很有用:

subset(DATAFRAME, COLUMNNAME == "")

对于调查包,可能survey包是否相关?

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

答案 5 :(得分:3)

您想要的答案在很大程度上取决于您想要分解数据框的方式和原因。

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

newdf <- mydf[,1:3]

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

newdf <- mydf[1:3,]

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

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

答案 6 :(得分:3)

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

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

答案 7 :(得分:3)

拆分数据框似乎适得其反。相反,使用split-apply-combine范例,例如,生成一些数据

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解决方案比拆分数据帧更快,但不如拆分应用组合快。