2016-12-22 8 views
0

ように私には見えますdata.tableを持っている:私は_...各ABCのためにやりたいことはあるR data.tableルール

>DT 
    ID Year Value ABC_1 ABC_2 ABC_3 
1: 3 2015  5  0  1  0 
2: 4 2015  2  1  0  1 
3: 5 2015  1  0  1  1 

> unique(DT[Year == 2015 & ABC_1 == 1, .(Year = Year, ABC = ABC_1, N = .N, MEAN = mean(Value))]) 
    Year ABC N MEAN 
1: 2015 1 1 2 
> unique(DT[Year == 2015 & ABC_2 == 1, .(Year = Year, ABC = ABC_2, N = .N, MEAN = mean(Value))]) 
    Year ABC N MEAN 
1: 2015 1 2 3 
> unique(DT[Year == 2015 & ABC_3 == 1, .(Year = Year, ABC = ABC_3, N = .N, MEAN = mean(Value))]) 
    Year ABC N MEAN 
1: 2015 1 2 1.5 

私はABC _...で20以上のカラムを持っていますので、この文をforループに入れたいと思います。私の問題は、選択/ルールが列名を必要とすることです。それはそれで動作しません:

> abc_name <- names(DT)[names(DT) %like% 'ABC'] 
> abc_name 
[1] "ABC_1" "ABC_2" "ABC_3" 
> abc_row<- data.table(Year=0, ABC=0, N=0, MEAN=0) 
> for (i in 1: length(abc_name)){ 
+ 
+ temp_row <- unique(DT[Year == 2015 & abc_name[i] == 1, .(Year = Year, ABC = abc_name[i], N = .N, MEAN = mean(Value))]) 
+ abc_row <- rbind(abc_row, temp_row) 
+ } 
> abc_row 
    Year ABC N MEAN 
1: 0 0 0 0 

temp_rowは空です... 私はABC_1abc_name[I]を変更すると、それは動作します:

> abc_name <- names(DT)[names(DT) %like% 'ABC'] 
> abc_name 
[1] "ABC_1" "ABC_2" "ABC_3" 
> abc_row<- data.table(Year=0, ABC=0, N=0, MEAN=0) 
> for (i in 1: length(abc_name)){ 
+ 
+ temp_row <- unique(DT[Year == 2015 & ABC_1 == 1, .(Year = Year, ABC = ABC_1, N = .N, MEAN = mean(Value))]) 
+ abc_row <- rbind(abc_row, temp_row) 
+ } 
> abc_row 
    Year ABC N MEAN 
1: 0 0 0 0 
2: 2015 1 1 2 
3: 2015 1 1 2 
4: 2015 1 1 2 

どのように私は、forループでabc_nameを使用することができますが私のスクリプトは動作しますか? 私の質問を理解し、誰かが私を助けてくれることを願っています。 lapplyを使用して名前ベクトル(「abc_name」)を通​​じて

答えて

0

ループ、OPのポストのロジックを適用し、getrbindlist要素と列の値を取得します。

lst <- lapply(abc_name, function(nm) 
      unique(DT[Year == 2015 & get(nm) == 1, 
      .(Year = Year, ABC = get(nm), N = .N, MEAN = mean(Value))])) 

rbindlist(lst) 
# Year ABC N MEAN 
#1: 2015 1 1 2.0 
#2: 2015 1 2 3.0 
#3: 2015 1 2 1.5 

それとも別のオプションは、「変数」と「年」と「I」で論理インデックス(value==1)を指定することにより、グループ化された「ワイド」に「長い」形式を、再構築するmeltあり、データセットの要約

melt(DT, measure = abc_name)[value==1, .(ABC=1, N= .N, 
    MEAN= mean(Value)), .(variable, Year)][, variable := NULL][] 
# Year ABC N MEAN 
#1: 2015 1 1 2.0 
#2: 2015 1 2 3.0 
#3: 2015 1 2 1.5