2017-12-19 4 views
2

R에 다음 함수를 작성하여 DATE (YYYY-MM-DD) 열이있는 데이터 프레임의 각 날짜와 전날의 2 일 평균 VAR을 계산했습니다.), ID, VAR1 및 VAR2. 날짜가 없습니다.평균 행과 data.frame의 이전 행

df <- data.frame 

TWODAY <- function(df){ 

df$TWODAY_VAR1 <- NA 
for(j in 2:length(df$VAR1)){ 
df$TWODAY_VAR1[j] <- mean(df$VAR1[j:(j-1)]) 
} 

df$TWODAY_VAR2 <- NA 
for(j in 2:length(df$VAR2)){ 
df$TWODAY_VAR2[j] <- mean(df$VAR2[j:(j-1)]) 
} 

return(df) 
} 

나는 다음 ddply 내 dataframe에이 기능을 적용 :

df <- ddply(df, "ID", TWODAY) 

하지만, 내 dataframe는 13,000,000 이상 관찰로 구성되며,이 매우 느리게 실행됩니다. 누구든지 내 코드를 편집하여 코드를 더 효율적으로 만들 수있는 방법에 대한 권장 사항이 있습니까?

모든 조언을 크게 높이세요! rowMeans를 사용

+2

나는이 질문에 대한 적당한 장소가 [코드 검토 스택 거래소 (생각 https://codereview.stackexchange.com/). – andrewnagyeb

+0

재현 가능한 예제를 제공해야합니다. https://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example – minem

답변

3

수동 벡터화 :

FOO <- function(x){ 
    c(NA, (x[2:length(x)]+x[1:(length(x)-1)])/2) 
} 

예 :

set.seed(123) 
df <- data.frame(VAR1 = rnorm(10000), VAR2 = runif(10000)) 

> head(df) 
     VAR1  VAR2 
1 -0.56047565 0.9911234 
2 -0.23017749 0.3022307 
3 1.55870831 0.4337590 
4 0.07050839 0.1605209 
5 0.12928774 0.8230267 
6 1.71506499 0.2080906 

df$TWODAY_VAR1 <- FOO(df$VAR1) 
df$TWODAY_VAR2 <- FOO(df$VAR2) 

> head(df) 
     VAR1  VAR2 TWODAY_VAR1 TWODAY_VAR2 
1 -0.56047565 0.9911234   NA   NA 
2 -0.23017749 0.3022307 -0.39532657 0.6466770 
3 1.55870831 0.4337590 0.66426541 0.3679948 
4 0.07050839 0.1605209 0.81460835 0.2971400 
5 0.12928774 0.8230267 0.09989806 0.4917738 
6 1.71506499 0.2080906 0.92217636 0.5155586 

이 꽤 빨리도 13 만 행하여야한다. 1 백만 줄이 나를 위해 초의 골절을합니다. 13.000.000 행이 하나의 변수에 대한


벤치 마크 :

> b 
Unit: seconds 
          expr  min  lq  mean median  uq  max neval 
df$TWODAY_VAR1 <- FOO(df$VAR1) 0.182657 0.209106 0.2308234 0.2175971 0.2239455 0.3119504 10 
2

해결책 :

nRow <- 13e6 
df <- data.frame(VAR1 = rnorm(nRow), 
       VAR2 = rnorm(nRow)) 
df$TWODAY_VAR1 <- rowMeans(cbind(df$VAR1, c(NA, df$VAR1[-nrow(df)]))) 
df$TWODAY_VAR2 <- rowMeans(cbind(df$VAR2, c(NA, df$VAR2[-nrow(df)]))) 

cbind 두 벡터 cbind(df$VAR1, c(df$VAR1[-1], NA) (마지막 행 NA) 및 rowMeans 적용.

+0

'NA'가 앞에 있지 않아야합니까? – minem

관련 문제