2012-04-17 5 views
1

큰 R 데이터 프레임의 모든 행에 대해 계산 최적화하는 방법 : 모든 고유 한 이름/일 쌍에 대해필터링 및 다음과 같은, 내가 데이터 프레임이

name day wages 
1 Ann 1 100 
2 Ann 1 150 
3 Ann 2 200 
4 Ann 3 150 
5 Bob 1 100 
6 Bob 1 200 
7 Bob 1 150 
8 Bob 2 100 

을, 나는을 계산하고 싶습니다 '이 사람의 현재 또는 다음 날 임금 총 횟수가 175 회를 넘었습니다.'와 같은 총계의 범위. 임금보다 많은 기둥이 있으며 각 행에 대해 각 합계에 적용 할 시간 분할표가 네 개 있습니다.

I은 ​​내 데이터 프레임 unique'ing 의해 달성 할 수 df 다음 함수 (명료성 긴 형식)을 df.unique 모든 행에 대해 다음

df.unique <- df[!duplicated(df[,c('name','day')]),] 

및 적용 :

for(i in 1:nrow(df.unique)) { 
    df.unique[i,"wages_gt_175_day_and_next"] <- wages_gt_for_person_today_or_next(df,175,df.unique[i,"day"],df.unique[i,"name"]) 
} 

wages_gt_for_person_today_or_next <- function(df,amount,day,person) { 
    temp <- df[df$name==person,] 
    temp <- temp[temp$day==day|temp$day==day+1,] 
    temp <- temp[temp$wages > amount,] 
    return(nrow(temp)) 
} 

이 간단한 예에서 나를 준다고 :

name day wages_gt_175_day_and_next 
Ann 1 1 
Ann 2 1 
Ann 3 0 
Bob 1 1 
Bob 2 0 

그러나 수십만 개의 행이있는 경우 이는 매우 느린 접근 방법입니다. 이 일을하는 더 똑똑한 방법이 있습니까? 행렬 연산, 적용, sqldf와 같은 것이 있습니까? 여기 data.table를 사용하여 비트 애호가 뭔가

structure(list(name = structure(c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 
2L), .Label = c("Ann", "Bob"), class = "factor"), day = c(1, 
1, 2, 3, 1, 1, 1, 2), wages = c(100, 150, 200, 150, 100, 200, 
150, 100)), .Names = c("name", "day", "wages"), row.names = c(NA, 
-8L), class = "data.frame") 

답변

3

, 당신의 예제 출력에서 ​​간단하게가는 :

코드 예제 DF를 다시

require(data.table) 
DT <- data.table(df) 
setkey(DT,name,day) 

DT[,list(gt175 = sum(wages >= 175)),list(name,day)][,list(day = day,gt175 = as.integer(gt175 + c(tail(gt175,-1),0) > 0)),list(name)] 

이 조금 복잡하지만, 빨리해야한다.

+0

감사합니다. 조란, 정말 빠릅니다. – Ina

관련 문제