2016-08-19 2 views
0

데이터가 4 개의 정적 변수와 열에 걸친 시계열 데이터로 구성된 새 시계열 변수를 만들려고합니다. 나는 매년 대하여마다 시리즈 열에서 값을 얻을 필요가 나는 최신 년 Del_0하는 각 그룹 내 등 Del_1의 전년에 대한 가치와 첫 번째 값을 얻을 필요가for 루프를 사용하여 기존 열의 새 변수에 값 할당

A B C year Del_0 Del_1 Del_2 Del_3 Del_4..... 
1 abc qwe 2012 1  2  3 4  5 
1 abc qwe 2013 3  5  3 6  8 
1 def qwe 2014 2  3  6 2  1 
1 def qwe 2013 12 23  21 45 43 

내가 원래 데이터

로 다시 병합

max_year<-  aggregate(newdata$Year,by=list(newdata$A,newdata$B,newdata$C),max) 

, B와 C

나는 각 클래스의 최대 해를 얻을 수 집계했다

각 그룹 내에서 가장 최근 연도의 차감 값 0을 사용하여 가장 최근 연도의 Del_0 값을 얻으려고합니다.

for 루프를 사용하려고합니다.

for(i in 0:4){ 
df[[paste(i, 'AVG', sep="_")]]<-newdata1$Del[i] 
} 

final data would be 
A B C year Del_0 Del_1 Del_2 Del_3 Del_4.....Avg0 Avg1 Avg2 Avg3 Avg4 
1 abc qwe 2012 1  2  3 4  5    2 
1 abc qwe 2013 3  5  3 6  8   3 
1 def qwe 2013 12 23  21 45 43    23 
1 def qwe 2014 2  3  6 2  1   2 

답변

0

data.table으로 쉽게 수행 할 수 있습니다. "newdata"에서 "Del"로 시작하는 열 이름을 가져오고 ('i1') _까지 부분 문자열 접두어를 sub까지 제거합니다. 'data.frame'을 'A', 'B'및 'C'열로 그룹화하고 .SDcols을 'i1'로 지정하여 'data.table'(setDT(newdata))으로 변환하고 데이터 하위 집합을 반복합니다. .table (lapply(.SD, ...)을 입력하고 max을 가져오고 (:=) 새 열 (' "Avg0", "Avg1"(paste0으로 생성)

library(data.table) 
i1 <- grep("^Del", names(newdata), value = TRUE) 
i2 <- sub(".*_", "", i1) 
setDT(newdata)[, paste0("Avg", i2) := lapply(.SD, max, na.rm = TRUE), 
      by = .(A, B, C), .SDcols = i1] 
+0

감사합니다. 그러나 평균값은 채워지지 않습니다. 그것들은 모두 NAs입니다. – bnair

+0

@bnair 원래 데이터 세트에서 NA 값이있는 경우'na.rm = TRUE' (게시물을 업데이트)를 사용하십시오. 또한 'str (newdata)'를 검사하여'Del '열이'numeric '인지 아닌지 확인하십시오. – akrun

관련 문제