将矢量随机分成两组

时间:2012-09-04 10:06:59

标签: r random sample random-sample

我有一个长度为100的向量t,并希望将其分为30和70值,但这些值应随机选择,无需替换。因此,30个值中没有一个被允许存在于70个值的子向量中,反之亦然。

我知道R函数sample,我可以使用它来随机选择带有和不带替换的向量的值。但是,即使我使用replace = FALSE,我必须使用30运行sample函数两次,并选择70个值运行一次。这意味着30个值中的一些可能在70个值中,反之亦然。

有什么想法吗?

4 个答案:

答案 0 :(得分:7)

这个怎么样:

t <- 1:100 # or whatever your original set is
a <- sample(t, 70)
b <- setdiff(t, a)

答案 1 :(得分:5)

关于我的评论,有什么问题:

vec <- 1:100
set.seed(2)
samp <- sample(length(vec), 30)

a <- vec[samp]
b <- vec[-samp]

要显示这些是不重复的单独集:

R> intersect(a, b)
integer(0)

如果你的载体中有重复的值是另一回事,但你的问题不清楚。

vec中的重复内容有点复杂,取决于你想要达到的结果。

R> set.seed(4)
R> vec <- sample(100, 100, replace = TRUE)
R> set.seed(6)
R> samp <- sample(100, 30)
R> a <- vec[samp]
R> b <- vec[-samp]
R> length(a)
[1] 30
R> length(b)
[1] 70
R> length(setdiff(vec, a))
[1] 41

所以setdiff()“失败”,因为它没有得到正确的长度,但是ab包含重复的值(但不是来自示例的观察!):

R> intersect(a, b)
 [1] 57 35 91 27 71 63  8 92 49 77

出现重复项(交集),因为上述值在原始样本中发生了两次vec

答案 2 :(得分:3)

这样的事情怎么样?

x <- 1:100
s70 <- sample(x, 70, replace=FALSE)
s30 <-sample(setdiff(x, s70), 30, replace=FALSE)

s30将与setdiff(x, s70)具有相同的数字,它们之间的区别是: s30长度为30且setdiff(x, s70)的无序向量将为您提供长度为30的(升序)有序向量。您说您想要长度为70和30的随机子样本,因此s30优于setdiff(x, s70)只是setdiff。如果订单无关紧要,那么更好的选择是使用sample而不是{{1}},就像@ seancarmody的回答一样。

答案 3 :(得分:1)

正如你所提到的“分裂”,你也可以尝试这样的事情:

set.seed(1)
t <- sample(20:40, 100, replace=TRUE)
groups <- rep("A", 100)
groups[sample(100, 30)] <- "B"
table(groups)
# groups
#  A  B 
# 70 30
split(t, groups)
# $A
#  [1] 25 32 39 24 38 39 33 21 24 23 36 40 27 36 24 33 22 25 28 28 38 27 30 30 23
# [26] 34 35 37 33 31 36 20 30 35 34 30 29 25 22 26 33 28 26 29 26 33 30 36 21 38
# [51] 27 37 27 27 30 38 38 36 29 34 28 26 35 25 23 25 21 33 36 28
# 
# $B
#  [1] 27 33 34 28 30 35 39 20 32 37 36 22 28 36 31 38 21 30 39 25 28 40 24 34 22
# [26] 38 36 29 37 32