6

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

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

有任何想法吗?

4

4 回答 4

8

这个怎么样:

t <- 1:100 # or whatever your original set is
a <- sample(t, 70)
b <- setdiff(t, a)
于 2012-09-04T10:20:24.683 回答
6

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

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()这里的“失败”因为它没有得到正确的长度,但是然后a包含b重复的值(但不是观察!来自样本):

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

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

于 2012-09-04T10:51:14.680 回答
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@seancarmody 的答案。

于 2012-09-04T10:20:35.057 回答
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
于 2012-09-04T10:26:12.213 回答