我想将一个数据帧分成几个较小的帧。这似乎是一个非常琐碎的问题,但是我无法从网络搜索中找到解决方案。

评论

从来没有了解过split(),但是我使用了dplyr中的ntile,然后按组索引(“ quartile”)进行过滤,完成了我想要的:group = df [df $ quartile == i,]。

#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


也可以拆分数据框基于现有列。例如,要基于cyl中的mtcars列创建三个数据帧:

split(mtcars,mtcars$cyl)


评论


嗨,格雷格,我不明白示例命令的语法,您能解释一下吗。

–阿尼鲁德(Anirudh)
2015年2月1日,9:45

“您可能还希望将数据帧切成任意数量的较小数据帧。在这里,我们将切成两个数据帧。”如果您在此处指定两个数据帧,这如何是任意数量的数据帧?

–user5359531
16-3-16在17:09



@ user5359531,这里任意两个数据帧。

–演示
16 Dec 10'在21:28

#2 楼

如果要根据某个变量的值拆分数据帧,建议使用daply()软件包中的plyr。 。要访问其中一个数据框,可以使用拆分变量级别的名称对其进行索引。

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


我确定没有其他数据框不过,在将数据分成多个数据帧之前,有更聪明的处理数据的方法。

评论


请预先声明非基本函数来自的软件包-大概是从plyr软件包中获取?

–mdsumner
2010年7月21日在20:12

我在代码段中加载了plyr,所以我认为这很清楚,但是为了清楚起见,我将编辑答案文章。

– JoFrhwld
2010年7月21日在20:18

我建议先使用dlply,但它不会通过分组变量自动命名条目。我不知道我先做什么,但是显然,除非指定了函数,否则daply无法工作。我编辑了工作答案。

– JoFrhwld
2010年7月21日在21:03

#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


干杯,塞巴斯蒂安

#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


评论


嗨,如果要基于该列中的唯一值将其动态拆分为另一个data_frame,该怎么办?

–kRazzy R
17-4-6在2:54



#5 楼

subset()也很有用:

subset(DATAFRAME, COLUMNNAME == "")


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

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-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解决方案比拆分数据帧更快,但不如split-apply-combine快。