data.tableの行を「ループスルー」して各行の平均を計算します。平均値は、以下のメカニズムに基づいて計算されるべきである:私は(ID(i))を一列に識別子IDをルックアップ条件付き平均を計算するための "ループスルー" data.table
- 行におけるT2の値I(T2(I))をルックアップ
- これら2つの基準を満たすすべての行
j
にData1
値の平均を計算する:ID(j) = ID(i)
と T1(j) = T2(i)
行の列データ2で算出した平均を入力IDF = data.frame(ID=rep(c("a","b"),each=6), T1=rep(1:2,each=3), T2=c(1,2,3), Data1=c(1:12)) DT = data.table(DF) DT[ , Data2:=NA_real_] ID T1 T2 Data1 Data2 [1,] a 1 1 1 NA [2,] a 1 2 2 NA [3,] a 1 3 3 NA [4,] a 2 1 4 NA [5,] a 2 2 5 NA [6,] a 2 3 6 NA [7,] b 1 1 7 NA [8,] b 1 2 8 NA [9,] b 1 3 9 NA [10,] b 2 1 10 NA [11,] b 2 2 11 NA [12,] b 2 3 12 NA
この単純な例の場合、結果は次のようになります。
ID T1 T2 Data1 Data2
[1,] a 1 1 1 2
[2,] a 1 2 2 5
[3,] a 1 3 3 NA
[4,] a 2 1 4 2
[5,] a 2 2 5 5
[6,] a 2 3 6 NA
[7,] b 1 1 7 8
[8,] b 1 2 8 11
[9,] b 1 3 9 NA
[10,] b 2 1 10 8
[11,] b 2 2 11 11
[12,] b 2 3 12 NA
私はこれを行う方法の1つは、行をループすることだと思うが、私はそれは非効率的だと思います。私はapply()
の機能を見てきましたが、私の問題を解決できるかどうかは確信しています。これがはるかに効率的またははるかに容易になるならばdata.table
の代わりにdata.frame
を使用することもできます。実際のデータセットには約100万行が含まれています。
書かれた仕様では操作が難しいように見えますが、あなたの例では、各IDグループ内で、T2がT1の値の範囲内にある値のグループの手段が必要であることが示唆されています。しかし、2行目のData2がなぜ5であるべきかを理解しようとすると、その解釈さえもばらばらになります。 –
@DWinそれは平均化が 'Data1'列で行われるからです。 '5は(4、5、6)の平均値なので、' Data2 [2] 'は5になります。 – ulidtko