我有一个 6 行的数据框。我想将其分成 5 部分,所以最终会有 4 个数据框,每个数据框有 1 个元素,最后一个数据框应该有 2 个元素。我已经尝试过以下代码。但这没有帮助。我是 R 新手。感谢任何帮助。
a = matrix(1:12,6,2)
d <- split(a,rep(1:6,each=4))
Warning message:
In split.default(a, rep(1:6, each = 4)) :
data length is not a multiple of split variable
split
需要一个分组向量作为第二个参数。在你的情况下
ngroups <- 5
floor(seq(1, ngroups, length.out = nrow(a)))
而且
split
不适用于矩阵,因此首先转换为 data.frame
:
split(as.data.frame(a), floor(seq(1, ngroups, length.out = nrow(a))))
编辑:根据@IShouldByABoat的建议,以下内容也适用于
matrix
对象:
split.as.data.frame(a, floor(seq(1, ngroups, length.out = nrow(a))))
不确定“每个元素 1”方面,这对于 R 版本的矩阵对象来说似乎有问题,但这里有一种方法可以拆分为满足要求的 12 元素矩阵的元素:
split( matrix(1:12,ncol=2), findInterval(1:6, c(sort(sample(1:6,5)),Inf)))
$`1`
[1] 1 7
$`2`
[1] 2 3 8 9
$`3`
[1] 4 10
$`4`
[1] 5 11
$`5`
[1] 6 12
如果你想将它们重新组成两列矩阵:
lapply( split( matrix(1:12,ncol=2), findInterval(1:6, c(sort(sample(1:6,5)),Inf))) ,
matrix, ncol=2)
$`1`
[,1] [,2]
[1,] 1 7
$`2`
[,1] [,2]
[1,] 2 8
$`3`
[,1] [,2]
[1,] 3 9
$`4`
[,1] [,2]
[1,] 4 10
[2,] 5 11
$`5`
[,1] [,2]
[1,] 6 12
我在 1:6 序列上使用模运算符解决了类似的问题。对于您的示例,请尝试以下操作:
a = matrix(1:12, 6, 2)
d = split(as.data.frame(a), 1:6%%5)
简单,就能完成工作。
要分割成 K 个折叠,您可能会发现使用以下命令很有用:
nfolds = 5
a = matrix(1:12, 6, 2)
folds = 1:nrow(a)%%nfolds # or sample(1:nrow(a)%%nfolds) if you want to randomize
fold = 1 # which ever fold you want to test with
train = a[folds != fold,]
test = a[folds == fold,]