2016-11-16 11 views
0

지난 주에 나는 question을 게시했습니다. 아이디어는 변수 "id"를 기반으로 한 관찰을 무작위로 결합하여 데이터베이스의 내용을 결정하는 루프를 만드는 것이 었습니다. 예컨대ID가 5 개 이상인 경우 변수 ID를 기준으로 관측치를 결합하십시오.

:

  • 세트 1 : ID 1, 2, 3, 4, 5, 6, 7, 8의 조합 ...
  • 세트 2 : ID (1, 2)의 조합, 3
  • 세트 3 : ID 2, 3, 4 조합 5
  • 세트 4 : 번호 5, 6, 7, 8, 9, 10의 조합 ...

는 I 완벽한있어 질문에 대한 답변 :

for(i in 2:max(o$id)){ 
    combis=combn(unique(o$id),i) 
    for(j in 1:ncol(combis)){ 
    sub=o[o$id %in% combis[,j],] 
    out=sub[1,] # use your function 
    out$label=paste(combis[,j],collapse ='') #provide an id so you know for which combination this result is 
    result=rbind(result,out) # paste it to previous output 
    } 
} 

그러나 지금 제 질문은 다음과 같습니다. 최소한 5 ids 이상의 조합 만 조합하도록 지정하는 방법이 있습니까?이 프로세스는 많은 계산 시간을 필요로하며 작은 데이터 세트 (5 개의 다른 ID보다 작은 파일)가 편향된 결과를 제공한다는 사실을 알게되었습니다.

link을 통해 예제를 재현 할 수있는 데이터 세트 및 전체 코드 샘플을 찾을 수 있습니다. 필자가 적어도 5 개의 ID 조합에만 관심이 있다고 명시된 경우를 제외하고는 전체 코드를 실행하는 데 시간이 걸릴 수 있습니다.

+1

최소한의 재현 가능한 예를 제공 할 수 있습니까? http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example – C8H10N4O2

+0

최근에 "카운트 (Count)"열을 만들고 모든 것을 필터링하여 분석을 수행했습니다. 조합/그룹에 속한 그룹의 수는 5 개 미만입니다. – heyydrien

+0

필자는 mapply 문을 사용하여 최적화 할 수 있으며 combis [length (combis)> 4]와 같은 필터링을 사용하여 조합을 제한하는 것이 더 빠릅니다. 그러나 재현 할 수있는 예제가 없으므로 확신 할 수 없습니다. 이전 게시물의 데이터가 작동하지 않습니다 (AllData 및 rainfed는 무엇입니까?) – Bastien

답변

1

당신은 5에서 루프를 시작할 수 있습니다

for(i in 5:max(o$id)){ 
    combis=combn(unique(o$id),i) 
    ... 

이 방법은, 각 조합 (? 참조 combn)에서 적어도 5 개 요소가있다.

+0

그것은 그렇게 쉬웠다. .. 다시 한번 감사드립니다! – user33125