我有一个包含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
答案 0 :(得分:2)
split
期望将带有组的向量作为第二个参数。在你的情况下
ngroups <- 5
floor(seq(1, ngroups, length.out = nrow(a)))
ans 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 :(得分:1)
不确定R'版本的矩阵对象似乎有问题的“每个1元素”方面,但是这里有一种方法可以分解为满足要求的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
答案 2 :(得分:0)
我在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,]