如何拆分数据框?

How to split a data frame?

提问人:Leo5188 提问时间:7/22/2010 最后编辑:josliberLeo5188 更新时间:7/24/2018 访问量:275440

问:

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

拆分 数据帧 R-FAQ

评论

3赞 jozxyqk 2/17/2015
从来不明白,但是使用 dplyrntile,然后按组索引(“四分位数”)过滤,做了我想要的: .split()group = df[df$quartile==i,]

答:

19赞 JoFrhwld 7/22/2010 #1

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

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

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

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

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

评论

0赞 mdsumner 7/22/2010
请预先说明非基本函数来自的包 - 大概您的意思是来自包 Plyr 的 daply?
0赞 JoFrhwld 7/22/2010
我在我的代码片段中加载了 plyr,所以我认为它很清楚,但为了清楚起见,我将编辑答案散文。
0赞 JoFrhwld 7/22/2010
我首先提出了建议,但它并没有通过分组变量自动命名条目。我不知道我先做了什么,但除非指定函数,否则它不起作用。我编辑了答案。dlplydaply
7赞 apeescape 7/22/2010 #2

subset()也很有用:

subset(DATAFRAME, COLUMNNAME == "")

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

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

71赞 Greg 7/22/2010 #3

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

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

您还可以基于现有列拆分数据框。例如,要根据 中的列创建三个数据框:cylmtcars

split(mtcars,mtcars$cyl)

评论

1赞 Anirudh 2/1/2015
嘿格雷格,我看不懂示例命令的语法,你能解释一下吗?
0赞 user5359531 3/17/2016
“您可能还希望将数据帧切割成任意数量的较小数据帧。在这里,我们切入两个数据帧。如果您在此处指定两个数据帧,这怎么是任意数量的数据帧?
2赞 Demo 12/11/2016
@user5359531,这里是任意两个数据帧。
8赞 Ben M 7/23/2010 #4

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

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

newdf <- mydf[,1:3]

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

newdf <- mydf[1:3,]

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

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

13赞 Sebastian 7/23/2010 #5

我刚刚发布了一种可能对您有所帮助的 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

干杯 塞巴斯蒂安

16赞 Dimitar Slavchev 7/28/2011 #6

您还可以使用

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

这将创建一个 DataFrame,其值为 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

评论

0赞 kRazzy R 4/6/2017
嗨,如果您想根据该列中的唯一值将其动态拆分为不同的data_frame,您将如何进行。?
3赞 mikeck 1/20/2015 #7

如果要按其中一列中的值进行拆分,可以使用 .例如,要为每只雏鸡拆分为单独的数据集:lapplyChickWeight

data(ChickWeight)
lapply(unique(ChickWeight$Chick), function(x) ChickWeight[ChickWeight$Chick == x,])
3赞 Martin Morgan 7/19/2016 #8

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

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

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