在R中将一个向量分为三个不等长度的向量

6
一个新手的问题:我想将一个向量分成三个不同长度的向量,并将每个向量中的值随机分配。例如,我想将下面长度为12的向量分成长度为2、3和7的向量。
我可以使用以下方法得到三个相等大小的向量:
test<-1:12
split(test,sample(1:3))

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

4个回答

14
你可以使用rep创建每个组的索引,然后根据这些索引进行拆分。
split(1:12, rep(1:3, c(2, 3, 7)))

如果你希望这些项目被随机分配,以便不仅是第一个向量中的前两个项目,第二个向量中的下一个三个项目,...,那么你可以添加调用sample

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

如果你没有想到具体的长度(2、3、7),只是不想每次得到等长的向量,那么SimonO101的回答就是正确的方式。


我本以为应该这样写:split(sample(1:12), rep(1:3, c(2, 3, 7)))。先排列再分割。但最终结果似乎是一样的。我不喜欢你的方法似乎会保持样本的顺序。 - IRTFM
@DWin - 这取决于你想要什么。按照我现在的方式,向量将被排序(或至少按照原始顺序)。如果这不是他们想要的,那么你的方式会更好。 - Dason
谢谢!这个很好用。感谢大家的快速回复。 - Emilio M. Bruna

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

sample 的第一个参数是把向量分成几组。第二个参数是向量的元素个数。这将随机地将每个连续的元素分配到三个向量之一。如果要分成四个向量,只需执行 split( test , sample(4, 12 , repl = TRUE) )


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

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

这也不会随机地将元素分割到每个向量中! - Simon O'Hanlon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接