我想将一个数据框拆分为几个较小的数据框。这看起来是一个非常微不足道的问题,但我无法从网络搜索中找到解决方案。
您可能还想将数据帧切割成任意数量的较小数据帧。在这里,我们切分成两个数据框。
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)
如果您想根据某些变量的值拆分数据框,我建议使用
daply()
包中的 plyr
。
library(plyr)
x <- daply(df, .(splitting_variable), function(x)return(x))
现在,
x
是一个数据帧数组。要访问其中一个数据帧,您可以使用拆分变量级别的名称对其进行索引。
x$Level1
#or
x[["Level1"]]
我确信在将数据分割成许多数据帧之前没有其他更聪明的方法来处理数据。
你也可以使用
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
我刚刚发布了一种可能对您有帮助的 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
干杯, 塞巴斯蒂安
您想要的答案很大程度上取决于您想要如何以及为何分解数据框。
例如,如果您想省略一些变量,您可以从数据库的特定列创建新的数据框。数据框后面括号中的下标表示行号和列号。查看 Spoetry 以获得完整的描述。
newdf <- mydf[,1:3]
或者,您可以选择特定行。
newdf <- mydf[1:3,]
这些下标也可以是逻辑测试,例如选择包含特定值的行,或者具有所需值的因子。
你想用剩下的块做什么?您需要对数据库的每个块执行相同的操作吗?然后,您需要确保数据帧的子集最终位于一个方便的对象中,例如列表,这将帮助您对数据帧的每个块执行相同的命令。
subset()
也很有用:
subset(DATAFRAME, COLUMNNAME == "")
对于调查包,也许
survey
包是相关的?
如果您想按其中一列中的值进行拆分,可以使用
lapply
。例如,将 ChickWeight
拆分为每个小鸡的单独数据集:
data(ChickWeight)
lapply(unique(ChickWeight$Chick), function(x) ChickWeight[ChickWeight$Chick == x,])
拆分数据框似乎会适得其反。相反,使用拆分-应用-组合范例,例如,生成一些数据
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 解决方案比分割数据帧更快,但不如 split-apply-combine 快。
如果您想根据特定列中的值拆分数据框,tidyverse 现在有一个名为
group_split
的函数可以执行此操作,您还可以轻松拆分多个列:
library(tidyverse)
cars <- mtcars %>%
group_by(cyl, gear)
cars_split <- group_split(cars)
上面的代码将为您提供一个包含 8 个数据帧的列表,每个数据帧都有
cyl
和 gear
的独特组合。