如何在R中使用基函数将data.frame分成两个相等的部分?
第二个data.frame如果有奇数将得到额外的行
index <- seq.int(nrow(df) / 2)
df[index, ]
df[-index, ]
如果您想更改拆分方式,可以轻松扩展。例如,要使用sample()
.
index <- sample(seq.int(nrow(df)), nrow(df) / 2)
下面的代码将在R中使用基函数将data.frame分成相等的两部分
# Where df is your data frame
n<-nrow(df)/2
n1<-(nrow(df)/2)+1
n2<-nrow(df)
df1<-df[1:n,]
df2<-df[n1:n2,]
rm(n,
n1,
n2)
这不会按任何特定标准对数据进行排序,也不会按行号随机拆分。如果你需要分割你的数据(例如,进入一个派生和验证队列),并且确信数据不会以一种会破坏你的分析的方式系统地按行排列,它是有用的。
另一个base
选项:
n <- nrow(data)/2
n_rows <- nrow(data)
split(data,
rep(1:ceiling(n_rows/n),
each=n,
length.out=n_rows))
输出:
$`1`
v1 v2
1 A 1
2 A 2
$`2`
v1 v2
3 B 3
4 B 4
数据data <- data.frame(v1 = c("A", "A", "B", "B"),
v2 = c(1,2,3,4))
可以用split()
+cut()
。
split(data, cut(1:nrow(data), 2, labels = FALSE))
split(sleep, cut(1:nrow(sleep), 2, labels = FALSE))
$`1`
extra group ID
1 0.7 1 1
2 -1.6 1 2
3 -0.2 1 3
4 -1.2 1 4
5 -0.1 1 5
6 3.4 1 6
7 3.7 1 7
8 0.8 1 8
9 0.0 1 9
10 2.0 1 10
$`2`
extra group ID
11 1.9 2 1
12 0.8 2 2
13 1.1 2 3
14 0.1 2 4
15 -0.1 2 5
16 4.4 2 6
17 5.5 2 7
18 1.6 2 8
19 4.6 2 9
20 3.4 2 10
split(sleep, cut(1:nrow(sleep), 2, labels = FALSE))
$`1`
extra group ID
1 0.7 1 1
2 -1.6 1 2
3 -0.2 1 3
4 -1.2 1 4
5 -0.1 1 5
6 3.4 1 6
7 3.7 1 7
8 0.8 1 8
9 0.0 1 9
10 2.0 1 10
$`2`
extra group ID
11 1.9 2 1
12 0.8 2 2
13 1.1 2 3
14 0.1 2 4
15 -0.1 2 5
16 4.4 2 6
17 5.5 2 7
18 1.6 2 8
19 4.6 2 9
20 3.4 2 10