2017-11-16 18 views
2

の値いずれかで名前の新しい列に結果を格納してグループ化する2レベルは、次の検討:Rのdata.table:レベル

dt1 <- data.table(id = c(1,1,1,2,2,2,2), status = c(0,1,1,2,3,0,2), val = c(2,2,4,1,2,3,1)) 

I名前の列を作るために、平均FUNCと(ID、ステータス)によってグループを使用これは0から3までのステータス値から構成されています。次の結果を

stat <- c(0:3) 
for(i in 1:length(stat)) dt1[, eval(paste("meanval.stat.", stat[i], sep = "")) := mean(val, na.rm = TRUE), by = .(id, status == stat[i])] 

を:

id status val meanval.stat.0 meanval.stat.1 meanval.stat.2 meanval.stat.3 
1: 1  0 2  2.000000   2.00  2.666667  2.666667 
2: 1  1 2  3.000000   3.00  2.666667  2.666667 
3: 1  1 4  3.000000   3.00  2.666667  2.666667 
4: 2  2 1  1.333333   1.75  1.000000  1.666667 
5: 2  3 2  1.333333   1.75  2.500000  2.000000 
6: 2  0 3  3.000000   1.75  2.500000  1.666667 
7: 2  2 1  1.333333   1.75  1.000000  1.666667 

しかし、私は別の結果李を期待KE次:

id status val meanval.stat.0 meanval.stat.1 meanval.stat.2 meanval.stat.3 
1: 1  0 2  2     3   0    0 
2: 1  1 2  2     3   0    0 
3: 1  1 4  2     3   0    0 
4: 2  2 1  3     0   1    2 
5: 2  3 2  3     0   1    2 
6: 2  0 3  3     0   1    2 
7: 2  2 1  3     0   1    2 

私はおそらくロジックが "とを比較することによって作成された論理vectorに基づく「val」をサブセット、「ID」によりグループになりますいただきました!私の解決策

答えて

1

のロジックと間違って理解しませんSTATの各要素を持つ 『状態』、meanを取得し、新しい列に割り当てる( 『』 NM1)、およびNaNがある場合は、setそれが0

nm1 <- paste0("meanval.stat.", stat) 
for(i in seq_along(stat)) { 
    dt1[, (nm1) := mean(val[status == stat[i]], na.rm = TRUE), .(id)][] 
} 

for(j in nm1) { 
    set(dt1, i = which(is.nan(dt1[[j]])), j = j, value = 0)[] 
} 
+0

理由が、溶液のdidn上記わかりませんの私のために働く。 'id'を1としたすべての行に対して' NaN'を取得しました。 – MKR

+0

@MKRあなたのdata.tableのバージョンは?私は '1.10.5'を使用しました – akrun

+0

鉱山は1.10.4-3です。 – MKR