我想要“循环遍历”data.table的行,并为每一行计算平均值。平均值应该基于以下机制计算:
- 查找行 i 中的标识符ID (ID(i))
- 查找行 i 中T2的值(T2(i))
- 计算符合这两个条件的所有行j中
Data1
值的平均值:ID(j) = ID(i)
且T1(j) = T2(i)
将计算出的平均值输入到行 i 的Data2列中。
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万行。
Data1
列上计算的。Data2[2]
等于 5,因为 (4, 5, 6) 的平均值是 5。 - ulidtko