将矢量随机分成两组

use*_*113 6 random r sample random-sample

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

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

有任何想法吗?

sea*_*ody 7

这个怎么样:

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


Rei*_*son 6

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

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

a <- vec[samp]
b <- vec[-samp]
Run Code Online (Sandbox Code Playgroud)

要显示这些是单独的集合,没有重复:

R> intersect(a, b)
integer(0)
Run Code Online (Sandbox Code Playgroud)

如果你的向量中有重复的值是另一回事,但你的问题不清楚.

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
Run Code Online (Sandbox Code Playgroud)

因此,setdiff()"失败"在这里,因为它没有得到正确的长度,但随后ab包含重复值(而不是观察从样本!):

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

产生重复(交叉)是因为上述值在原始样本中出现了两次 vec