«Прокручивать» data.table для вычисления условных средних значений

Я хочу "перебрать" строки таблицы data.table и вычислить среднее значение для каждой строки. Среднее значение должно рассчитываться на основе следующего механизма:

  1. Найдите идентификатор ID в строке i (ID(i))
  2. Найдите значение T2 в строке i (T2(i))
  3. Вычислите среднее по значениям Data1во всех строках j, которые соответствуют этим двум критериям: ID(j) = ID(i)и T1( j) = T2(i)
  4. Введите вычисленное среднее значение в столбец Data2 строки i

    DF = data.frame(ID=rep(c("a","b"),each=6),
    T1=rep(1:2,каждый=3), T2=c(1,2,3), Data1=c(1:12))
    DT = data.table (DF)
    DT[, Данные2:=NA_real_]
    ID T1 T2 Данные1 Данные2
    [1,] а 1 1 1 нет данных
    [2,] а 1 2 2 н/п
    [3,] а 1 3 3 н/п
    [4,] а 2 1 4 н/п
    [5,] а 2 2 5 н/п
    [6,] а 2 3 6 н/п
    [7,] б 1 1 7 н/д
    [8,] б 1 2 8 н/д
    [9,] б 1 3 9 н/д
    [10,] б 2 1 10 н/п
    [11,] б 2 2 11 н/д
    [12,] б 2 3 12 н/п
    

Для этого простого примера результат должен выглядеть следующим образом:

      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 миллион строк.

11
задан 42- 23 March 2012 в 17:35
поделиться