2017-11-20 9 views
2

이 버클을 R로 발견했는데 왜 발생했는지에 대한 많은 증거를 찾을 수 없습니다. 수표로 샘플을 다시 만들려고했는데 어떤 경우에는 sample 함수가 다르게 작동하는 것을 발견했습니다. 이 예를 참조하십시오R 샘플 함수가 1 천만 개가 넘는 값을 표시합니다.

# Look at the first ten rows of a randomly ordered vector of the first 10 million integers 
set.seed(4) 
head(sample(1:10000000), 10) 
[1] 5858004 89458 2937396 2773749 8135739 2604277 7244055 9060916 9490395 731445 

# Select a specified sample of size 10 from this same list 
set.seed(4) 
sample(1:10000000), size = 10) 
[1] 5858004 89458 2937396 2773749 8135739 2604277 7244055 9060916 9490395 731445 


# Try the same for sample size 10,000,001 
set.seed(4) 
head(sample(1:10000001), 10) 
[1] 5858004 89458 2937396 2773750 8135740 2604277 7244056 9060917 9490396 731445 

set.seed(4) 
sample(1:10000001), size = 10) 
[1] 5858004 89458 2937397 2773750 8135743 2604278 7244060 9060923 9490404 731445 

나는이 1000 만 임계 값에 많은 값을 테스트하고 값이 일치하는 것을 발견 (I은 10 개 이상의 출력 행을 테스트하지 인정하지만).

누구에게 무슨 일이 일어나고 있는지 알고 계십니까? 이 1000 만 개의 숫자에 대해 중요한 점이 있습니까?

답변

5

예, 1e7에 대한 특별한 내용이 있습니다. sample 코드를 보면 sample.int으로 끝납니다. 당신이 ?sample에서 볼 수 있듯이, sample.intuseHash 인수의 기본값은 && n > 1e7 당신이 1e7 위 얻을 때, 기본 환경 설정 useHash = TRUE로 전환을 의미

useHash = (!replace && is.null(prob) && size <= n/2 && n > 1e7) 

입니다. 일관성을 유지하려면 sample.int으로 직접 전화하고 useHash 값을 지정하십시오. (TRUE은 메모리 효율성에 대한 좋은 선택입니다. 자세한 내용은 ?sample의 인수 설명을 참조하십시오.)

+1

감사합니다. @ Gregor. 문서를 더 파헤쳐 야합니다. 코드를 살펴본 후,'useHash = TRUE' 일 때'sample'보다는'sample2'를 호출한다는 것을 알았습니다. 나는 아직도 실제로 일어나고있는 것을 이해하려고 노력하고있다. – alwaysnew

+0

'sample'은 항상'sample.int'를 호출합니다. 'sample.int', * .Internal()'*을 사용하면'useHash'에 따라 C로 작성된 두 개의'sample' 구현 중 하나를 호출 할 것입니다. '.Primitive' 또는'.Internal'을 볼 때마다 그것은 R을 호출하는 것입니다.'sample2'는 해시 테이블을 사용하는 메모리 효율적인 구현이고, 'sample'은 작은 데이터에 대해보다 유연한 기본값입니다. Dominic의 대답에서'pryr'를 사용하여 코드를 보는 방법에 대한 지침을 포함하여 [자세한 내용은이 질문을 참조하십시오] (https://stackoverflow.com/q/14035506/903061). 얼마나 더 당신이 원하는지/이해할 필요가 있는지 잘 모르겠습니다 ... – Gregor