2017-03-18 4 views
-1

나는이 쿼리에 대한 해결책을 찾고 커뮤니티가 영감을 줄 수 있기를 바란다. data.table의 조건부 크기 샘플

나는 다음과 같이 큰 data.table가 표시 고객 활동 정보로 구성된이 있습니다

library(data.table) 
library(dplyr) 

DF = as.data.table(NULL) 
cust_index = as.data.table(seq(1000,10000,3)) # list of unique customers 
colnames(cust_index) = "cust_id" 

# create a list of all customer activity - each cust_id represents an active event 

for (cust in cust_index$cust_id){ 
    each_cust = as.data.table(rep(cust, sample(1:17,1, replace=FALSE))) 
    DF = bind_rows(DF, each_cust) 
    } 
rm(each_cust) 
colnames(DF) = "cust_id" 
setkey(DF, cust_id) 

# add dummy data for activity 
DF[, A:= sample(x = c(0,1), size = nrow(DF), replace = TRUE)] 
DF[, B:= sample(x = c(0,1), size = nrow(DF), replace = TRUE)] 
DF[, C:= sample(x = c(0,1), size = nrow(DF), replace = TRUE)] 

내가 DF 4 개 고객 관측의 최대 샘플링합니다.

sample.cust = function(x){ 
    if (nrow(x)<4) { 
    cust_sample = x 
    } else { 
    cust_sample = x[sample(1:4,replace=FALSE)] 
    } 
    return(cust_sample) 
} 

.. for 루프 내에서 호출됩니다

은 지금까지 나는 어떤 샘플 단일 고객에 대한 관찰 상대적 기능을 사용하고 있습니다.

for (cust in cust_index$cust_id){ 
    cust.sample = train.data[.(cust), sample.cust(.SD)] 
    train.sample = bind_rows(train.sample, cust.sample) 
} 

.. 그러나 위의 루프는 절대로 종료되지 않습니다.

저는 모든 것을 시도해 보았습니다 : = 지금까지는 성공하지 못했던 조합을 설정했습니다. 모든 제안은 내가 상상하는 것이 다소 사소한 해결책 일 것이라고 대단히 감사하게 생각할 것입니다.

많은 감사, M.

+1

dplyr 패키지가 추가 된 –

답변

1

해결책은 데이터 테이블에서 .I 연산자 사용하여 인덱스 편지 삭제 대답 주석으로 게시 된이 유용 동안은 무시

DF[DF[,sample((.I), min(.N, 4), replace=FALSE), by=cust_id]$V1] 

을 샘플링 할 행의 길이가 1 인 경우 data.table 내에 함수 호출을 포함하면 올바른 결과를 얻을 수 있습니다.

+0

아, 좋은 지적이야. 나는 그 가장자리 사건을 항상 잊는다. 참고로, $ V1 아이디어는 http://stackoverflow.com/questions/16573995/subset-by-group-with-data-table/16574176#16574176에서 가져옵니다. – Frank