2017-09-28 2 views
1

의 조건으로 각 요소 계산은 I는 데이터 프레임 (DF)가creat에 새로운 열 및 R

a b c 
12 14 21 
71 23 58 
20 33 64 
3 22 12 
25 55 19 
31 14 20 
29 20 31 
10 10 41 
20 37 33 
31 99 43 
42 24 34 

각 요소는이 데이터 프레임에는 패턴이없는 다음과 같다있다.

list<-c(1,3,5) 

내 현재 코드 내가 루프를, 평균 (안양 $ d 개)를 계산, "목록"의 각 요소에 대해

df$d<-NA 

    for (i in 1:length(list)){ 
     for(j in 1:nrow(df)){ 
    df$d[j]<- df$c[j]- df$b[j+i] 
    print(mean(df$d, na.rm=TRUE)) 
} 
} 

을하고, 다음 다음를 찾아서 다시 루프를 그에게 물어 다시 평균 (df $ d).

예상 결과 : I = 1

a b c d 
12 14 21 -2 (=21-23) 
71 23 58 25 (=58-33) 
20 33 64 42 
3 22 12 -43 
25 55 19 5 
31 14 20 0 
29 20 31 21 
10 10 41 4 
20 37 33 -66 
31 99 43 19 
42 24 34 NA 

후, 인 열 "D"의 의미를 찾을 때

((DF $으로 D의 na.rm = TRUE)을 의미하는 5/10rows = 0.5이 제가 필요 정말 의미이다.

제가

= 3
a b c d 
12 14 21 -1 (=21-22) 
71 23 58 3 (=58-55) 
20 33 64 50 
3 22 12 -8 
25 55 19 9 
31 14 20 -17 
29 20 31 -68 
10 10 41 17 
20 37 33 NA 
31 99 43 NA 
42 24 34 NA 

이어서, 컬럼 "D"의 의미를 찾아 어떤 (평균 (df $ d, na.rm = TRUE)는 -15/8rows = -1.875입니다.이 평균값은 실제로 필요한 것입니다.

이 코드는 두 개의 루프가 실행되고 전체 데이터에 50,000 개 이상의 행이 있고 실제 목록에 15 개 이상의 요소가 있으므로 매우 느립니다. 따라서 오래 걸립니다. 누군가 제발 나를 도와주세요, 정말 고마워요.

+0

나는 단지 "list"에서 처음 2 개의 루프에 대한 몇 가지 예상 결과를 추가했습니다. – jester

답변

2

sapply을 사용하여 list의 각 요소를 반복 할 수 있습니다. leaddplyr부터 사용하여 b의 선행 값을 구한 다음 c 열에서 빼고 NA 값을 제거하여 mean을 계산합니다.

library(dplyr) 
sapply(list, function(x) mean(df$c - lead(df$b, x), na.rm = T)) 

#[1] 0.500000 -1.875000 -1.666667