2015-10-28 3 views
1

У меня есть data.table, который выглядит следующим образом:Используйте предыдущее расчетное значение строки в г

DT <- data.table(A=1:20, B=1:20*10, C=1:20*100) 
DT 
    A B C 
1: 1 10 100 
2: 2 20 200 
3: 3 30 300 
4: 4 40 400 
5: 5 50 500 
... 
20: 20 200 2000 

Я хочу, чтобы иметь возможность рассчитать новый столбец «D», который имеет первое значение как среднее первые 20 строк в столбце B в качестве первого значения, а затем я хочу использовать первую строку столбца D, чтобы подсчитать следующее значение строки D.

Скажите, что среднее из первых 20 строк столбца B 105. Формула для следующей строки в столбце D такова: DT $ D [1] + DT $ C [2] , где я беру предыдущее значение строки D и добавляю значение строки C. t Hird строка будет выглядеть следующим образом: DT $ D [2] + DT $ C [3]

A B C D 
1: 1 10 100  105 
2: 2 20 200  305 
3: 3 30 300  605 
4: 4 40 400 1005 
5: 5 50 500 1505 
... 
20: 20 200 2000 21005 

Любые идеи по этому вопросу будет принято?

Я думаю, что сдвиг будет большой помощью для отставания, но не знает, как избавиться от НС, который он производит в первом случае?

+0

Try 'library (RcppRoll); DT [, D: = cumsum (roll_mean (B, 20))] 'Данные примера не содержат 20 строк, поэтому это не проверено. – akrun

+0

Вы используете только первые 20 строк и не расширяете его? – akrun

+0

Я не думаю, что они распространяют среднее. Найдите среднее значение один раз, добавьте столбец C после –

ответ

3

Мы можем принять среднее значение для первых 20 строк столбца B и добавить суммарную сумму C. Кумулятивная сумма имеет одно особое соображение, что мы хотим добавить конкатенацию 0 и столбец C без первого значения.

DT[, D := mean(B[1:20]) + cumsum(c(0, C[-1]))][] 
#  A B C  D 
# 1: 1 10 100 105 
# 2: 2 20 200 305 
# 3: 3 30 300 605 
# 4: 4 40 400 1005 
# 5: 5 50 500 1505 
# 6: 6 60 600 2105 
# 7: 7 70 700 2805 
# 8: 8 80 800 3605 
# 9: 9 90 900 4505 
# 10: 10 100 1000 5505 
# 11: 11 110 1100 6605 
# 12: 12 120 1200 7805 
# 13: 13 130 1300 9105 
# 14: 14 140 1400 10505 
# 15: 15 150 1500 12005 
# 16: 16 160 1600 13605 
# 17: 17 170 1700 15305 
# 18: 18 180 1800 17105 
# 19: 19 190 1900 19005 
# 20: 20 200 2000 21005 
+0

Это отлично, спасибо ! Что произойдет, если вместо добавления C я хочу умножить его на число? – KhalidN

+0

Спасибо @DavidArenburg. Использование сдвига является хорошим, но я не получаю такую ​​же сумму в новом столбце –

+0

@KhalidN У вас есть столбец чисел типа 'C' или одно значение? –

Смежные вопросы