5

来自相对 n00b 的问题:我想将一个向量拆分为三个不同长度的向量,并随机分配给每个向量的值。例如,我想将下面长度为12的向量拆分为长度为2,3和7的向量

我可以使用这个得到三个大小相等的向量:

test<-1:12
split(test,sample(1:3))

关于如何将测试拆分为 2,3 和 7 的向量而不是长度为 4 的三个向量的任何建议?

4

4 回答 4

12

您可以使用rep为每个组创建索引,然后根据该索引进行拆分

split(1:12, rep(1:3, c(2, 3, 7)))

如果您希望随机分配项目,以便它不仅仅是第一个向量中的前 2 个项目,第二个向量中的接下来 3 个项目,...,您可以添加调用sample

split(1:12, sample(rep(1:3, c(2, 3, 7))))

如果您没有考虑特定的长度(2,3,7),但只是不希望它每次都是相等长度的向量,那么 SimonO101 的答案就是要走的路。

于 2013-08-23T15:37:20.047 回答
5

sample使用方式略有不同如何...

set.seed(123)
test<-1:12
split( test , sample(3, 12 , repl = TRUE) )

#$`1`
#[1] 1 6

#$`2`
#[1]  3  7  9 10 12

#$`3`
#[1]  2  4  5  8 11

set.seed(1234)
test<-1:12
split( test , sample(3, 12 , repl = TRUE) )

#$`1`
#[1] 1 7 8

#$`2`
#[1]  2  3  4  6  9 10 12

#$`3`
#[1]  5 11

in 的第一个参数sample是将向量拆分成的组数。第二个参数是向量中元素的数量。这会将每个连续元素随机分配到 3 个向量之一。对于 4 个向量,只需执行split( test , sample(4, 12 , repl = TRUE) ).

于 2013-08-23T15:38:22.330 回答
1

这比你想象的要容易。要将向量拆分为三个随机选择的新集合,请运行以下代码:

test <- 1:12
split(sample(test), 1:3)

通过在您运行此代码的任何时候这样做,您将在三个不同的集合中获得一个新的随机分布(非常适合 k 折交叉验证)。

你得到:

> split(sample(test), 1:3)
$`1`
[1] 5 8 7 3

$`2`
[1]  4  1 10  9

$`3`
[1]  2 11 12  6

> split(sample(test), 1:3)
$`1`
[1] 12  6  4  1

$`2`
[1] 3 8 7 5

$`3`
[1]  9  2 10 11
于 2016-12-01T13:37:54.727 回答
0

您可以使用辅助向量来格式化您想要拆分数据的方式。例子:

Data <- c(1,2,3,4,5,6)

Format <- c("X","Y","X","Y","Z,"Z")

output <- split(Data,Format)

将生成输出:

$X
[1] 1 3

$Y
[1] 2 4

$Z
[1] 5 6
于 2013-08-23T15:44:21.913 回答