我有一个长度为100的向量t,并且希望将其分为30和70个值,但值应该随机选择而不需要替换。因此,30个值中没有一个被允许处于70值的子矢量中,反之亦然。将矢量随机分为两组
我知道R函数sample
,我可以使用它随机选择带和不带替换的矢量值。但是,即使我使用replace = FALSE,我也必须使用30次运行sample
函数一次,并使用70次值选择一次。这意味着30个值中的一些值可能在70个值中,反之亦然。
任何想法?
我有一个长度为100的向量t,并且希望将其分为30和70个值,但值应该随机选择而不需要替换。因此,30个值中没有一个被允许处于70值的子矢量中,反之亦然。将矢量随机分为两组
我知道R函数sample
,我可以使用它随机选择带和不带替换的矢量值。但是,即使我使用replace = FALSE,我也必须使用30次运行sample
函数一次,并使用70次值选择一次。这意味着30个值中的一些值可能在70个值中,反之亦然。
任何想法?
如何:
t <- 1:100 # or whatever your original set is
a <- sample(t, 70)
b <- setdiff(t, a)
与其他一些条目相同的评论; 'setdiff()'方法只有在isTRUE(all(!duplicated(t)))'时才有效。如果有重复的值,它就会“失败”。 –
同意,但我怀疑OP有一个具有唯一值的向量(否则,避免使用替换采样就不那么重要)。 – seancarmody
在这种情况下,一旦你有了第一个样本(比如说30),你就可以通过负面索引获取其他样本,你不需要'setdiff()'。这项工作有点过分了,不是吗? –
什么这样的事情?
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的答案中一样。
捕捉!虽然你并不需要第二个例子中的样本,但除非你想打乱这个在OP中不太清楚的命令(“分成30和70的值......”) – seancarmody
@seancarmody你是对的。我在编辑中做了一些指示。 –
清晰的阐述。 – seancarmody
正如你所提到的 “分裂”,你也可以尝试这样的事:
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
我认为OP希望没有替换的样本,第一个向量中的值不能包含在第二个向量中。他不是吗? –
@Jilber,我不认为这个问题是完全清楚的。如果我用我的“t”和你的答案或肖恩的话,第一步就很好,但第二步不行。你是否用比1:100少的整齐数据来回答你的答案?我的*假设*是他们担心根据其指数或头寸来选择一个数字,而不是数值。 – A5C1D2H2I1M1N2O1R2T1
根据你的假设你是对的。是的,这个问题还不够清楚。 –
关于我的评论,什么是错的:
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
很困惑。为什么你不能使用'sample()'随机选择30个,然后选择其他任何一个* 30个随机样本作为另一个样本。根据定义,这两套将是独一无二的。 –
@GavinSimpson,这几乎是我在我的答案中所做的,只是添加一个分组变量来分割;但是,我仍然不确定他们实际上在寻找什么。 – A5C1D2H2I1M1N2O1R2T1
感谢您的答案!我尝试了不同的解决方案,他们都似乎工作。我刚刚遇到了一个不同的R包:ftp://ftp.ee。freebsd.org/pub/pkgsrc/current/pkgsrc/math/R-e1071/README.html这实际上是我想要的。但是,我根本没有安装它。我下载了.tgz文件,并试图安装它,但它失败了...... – user969113