6

長さ 100 のベクトル t があり、それを 30 と 70 の値に分割したいのですが、値はランダムに、置換なしで選択する必要があります。したがって、30 個の値のいずれも 70 個の値のサブ ベクトルに含めることはできず、その逆も同様です。

sampleベクトルからランダムに値を選択するために使用できるR 関数を知っています。ただし、replace = FALSE を使用する場合でも、sample選択する値を 30 で 1 回、70 で 1 回、関数を 2 回実行する必要があります。つまり、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

上記の値が元のサンプルで 2 回発生したため、重複 (交差) が発生します。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 の順序付けられていないベクトルで、長さ 30setdiff(x, s70)の (昇順の) 順序付けられたベクトルが得られます。長さ 70 と 30 のランダムなサブサンプルが必要だと言いs30ましたsetdiff(x, s70)。順序が実際には問題にならない場合は、@ seancarmody の回答のように、setdiffなしで使用することをお勧めします。sample

于 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 に答える