我想「循環」data.table的行並計算每行的平均值。平均應該基於下面的機理來計算:「循環遍歷」data.table來計算條件平均值
- 裏查找行中的識別符ID I(ID(i))的
- 查找T2的值在第i行(T2(i))的
- 計算平均通過
Data1
值中的所有行j
,滿足這兩個標準:ID(j) = ID(i)
和T1(j) = T2(i)
在行的列數據2輸入所計算出的平均I
DF = 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
,我認爲這樣做是通過行循環的一種方式,但我認爲這是低效的。我查看了apply()
函數,但我確定它是否能解決我的問題。如果這樣可以使效率更高或更容易,我也可以使用data.frame
而不是data.table
。真實的數據集包含大約100萬行。
您編寫的規範看起來很難實現,但您的示例建議在每個ID組中您想要某些值組的值的平均值,其中T2在T1的值範圍內。但是,當試圖弄清楚爲什麼第二行中的Data2應該是5時,即使這種解釋也會崩潰。 – 2012-03-23 17:48:38
@DWin這是因爲平均值是在'Data1'列上完成的。 'Data2 [2]'等於5,因爲5是'(4,5,6)'的平均值。 – ulidtko 2012-03-23 17:57:29