#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快。
评论
从来没有了解过split(),但是我使用了dplyr中的ntile,然后按组索引(“ quartile”)进行过滤,完成了我想要的:group = df [df $ quartile == i,]。