将矢量分成R中不等长度的三个矢量

时间:2013-08-23 15:33:26

标签: r

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

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

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

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

4 个答案:

答案 0 :(得分:11)

您可以使用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的答案是可行的。

答案 1 :(得分:4)

如何稍微区别地使用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

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

答案 2 :(得分: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

答案 3 :(得分: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