【发布时间】:2012-03-23 17:27:40
【问题描述】:
我想“遍历”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 万行。
【问题讨论】:
-
您编写的规范似乎难以操作,但您的示例表明,在每个 ID 组中,您需要 T2 在 T1 值范围内的某些值组的平均值。但是,当试图弄清楚为什么第二行中的 Data2 应该是 5 时,即使这种解释也失败了。?????
-
@DWin 这是因为平均是在
Data1列上完成的。Data2[2]等于 5,因为 5 是(4, 5, 6)的平均值。
标签: r data.table