Я хочу "прокрутить" строки таблицы данных и вычислить среднее значение для каждой строки. Среднее значение должно рассчитываться на основе следующего механизма:
- Найдите идентификатор идентификатора в строке я (ID (i))
- Посмотрите значение T2 в строке я (T2 (i))
- Вычислить среднее значение по значениям
Data1
во всех строкахj
, которые соответствуют этим двум критериям:ID(j) = ID(i)
иT1(j) = T2(i)
-
Введите вычисленное среднее значение в столбце Data2 строки 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
, если бы это сделало его намного более эффективным или намного более простым. Реальный набор данных содержит приблизительно 1 миллион строк.