2012-09-04 6 views
3

길이가 100 인 벡터 t를 가지며 30과 70 값으로 나누고 싶지만 그 값은 무작위로 그리고 대체없이 선택해야합니다. 따라서 30 개 값 중 70 개 값의 하위 벡터에있는 값은 허용되지 않으며 그 반대도 마찬가지입니다.벡터를 두 세트로 무작위로 나눕니다.

저는 R 함수 sample을 알고 있습니다.이 함수는 벡터 값을 임의로 선택하는 데 사용할 수 있습니다. 그러나, 내가 replace = FALSE를 사용하더라도, 나는 sample 함수를 한 번 두 번 30 번 실행하고 한 번 70 번 값을 선택해야합니다. 즉, 30 개의 값 중 일부는 70의 값을 가질 수 있으며 그 반대도 마찬가지입니다.

아이디어가 있으십니까?

+0

오전 혼란 스럽습니다. 왜 'sample()'을 사용하여 30을 무작위로 선택 할 수 없으며 다른 세트로 30 개의 무작위 샘플보다 * * other *를 모두 선택할 수는 없습니다. 정의에 따르면이 두 세트는 고유 할 것입니다. –

+0

@ GavinSimpson, 그게 내 답변에서했던 것입니다. 단지 그룹핑 변수를 추가하면됩니다. 그러나 나는 그들이 실제로 무엇을 찾고 있는지 아직 확실하지 않다. – A5C1D2H2I1M1N2O1R2T1

+0

답장을 보내 주셔서 감사합니다. 나는 다른 솔루션을 시도하고 모두 작동하는 것 같습니다. 방금 다른 R 패키지를 보았습니다 : ftp://ftp.ee.freebsd.org/pub/pkgsrc/current/pkgsrc/math/R-e1071/README.html 실제로 내가 원하는 것을 수행합니다. 그러나, 나는 그것을 전혀 설치하지 않습니다. .tgz 파일을 다운로드하고 설치하려고했지만 실패했습니다 ... – user969113

답변

6

이 방법에 대해 :

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

다른 항목과 같은 코멘트입니다. 'setdiff()'접근법은'isTRUE (all (! duplicated (t)))'에서만 작동합니다. 반복되는 값이 있으면 "실패"합니다. –

+0

동의하지만 OP에 고유 한 값이있는 벡터가 있다고 의심됩니다 (그렇지 않으면 대체로 샘플링하는 것을 덜 중요하게 여깁니다). – seancarmody

+0

그런 경우, 첫 번째 샘플 (예를 들어 30)을 갖게되면 음의 색인으로 다른 샘플을 가져올 수 있으므로'setdiff()'가 필요하지 않습니다. 이 직업에 대한 약간의 살인이 아닌가? –

3

어떻게 이런 일에 대해?

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

s30setdiff(x, s70) 같은 숫자를해야합니다, 그들 사이의 차이는 다음과 같습니다 이 s30 길이 30 setdiff(x, s70)의 정렬되지 않은 벡터가 당신에게 (오름차순)를 줄 것이다 당신은 임의의 원하는 말했다 길이 (30)의 벡터를 주문 길이가 70과 30 인 서브 샘플이므로 s30은 단지 setdiff(x, s70)보다 낫습니다. 순서가 정말로 중요하지 않다면, 더 좋은 대안은 @ seancarmody의 답과 같이 sample없이 setdiff을 사용할 것입니다. 당신이 "분할"언급했듯이

+1

스냅! 두 번째 예제에서 예제가 실제로 필요하지 않지만 OP에서 분명하지 않은 순서를 섞기를 원하지 않는 한 ("30 및 70 값으로 나누기 ...") – seancarmody

+1

@seancarmody 네 말이 맞아. . 편집 할 때 약간의 포인터를 만들었습니다. –

+0

좋은 명확한 정교. – seancarmody

1

, 당신은 또한이 같은 시도 할 수 있습니다 :

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

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

:

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 
+0

나는 OP가 대체물이없는 샘플을 원하고 첫 번째 벡터의 값이 두 번째 벡터에 포함되어서는 안된다고 생각한다. 그렇지 않니? –

+0

@ 박버, 나는 그 질문이 완전히 명확하지 않다고 생각한다. "t"와 답 또는 Sean 's를 사용하면 첫 번째 단계는 괜찮지 만 두 번째 단계는 효과가 없습니다. 1 : 100보다 적은 깔끔한 데이터로 답을 시도 했습니까? 내 가정 * 그들은 값이 아닌 인덱스 나 위치에 따라 숫자를 선택하는 것에 관심이있었습니다. – A5C1D2H2I1M1N2O1R2T1

+0

귀하의 가정에 근거하여 귀하는 옳습니다. 그리고 네, 그 질문은 충분히 명확하지 않습니다. –

4

내 댓글에 대해서는를, 어떤 문제가 있습니까?

이없이 중복으로 별도의 집합입니다 표시하려면

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

관련 문제