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

问题描述 投票:0回答:3

我有一个 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
r split
3个回答
2
投票

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
投票

不确定“每个元素 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

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,]
© www.soinside.com 2019 - 2024. All rights reserved.