在R中随机化后将数据帧拆分为K折叠

时间:2014-01-25 05:59:21

标签: r split

我有一个包含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

3 个答案:

答案 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,]