2016-08-19 11 views
0

データが4つの静的変数と列間の時系列データからなる新しい時系列変数を作成しようとしています。私はAの各グループ内のように最初の最新年度の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の

私は、クラスごとに最大年を取得するために集計を行いました

私は最新の年のDel_0値を、各グループ内の最新の年の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"( "i1")の "Del"で始まる列名を取得し、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

関連する問題