R: Как добавить столбец в фрейм данных, в каждой строке которого будет совокупная сумма всех его предыдущих строк?

У меня простой вопрос, но я не могу найти ответ на stackoverflow. Возможно, я использую неправильные условия поиска. В любом случае это мой вопрос:

Я хочу добавить столбец в фрейм данных с в каждой строке совокупной суммой всех предыдущих строк. Например, у меня есть dataframe X со столбцами V1 и V2. В этом случае V3 в примере — это добавленный столбец, который я хочу создать:

X=

V1 V2  V3
1  0.5 0.5
2  2.0 2.5
3  1.9 4.4
4  0.0 4.4
5  5.1 9.5

Фактический фрейм данных, к которому я хочу применить это, на самом деле намного больше (5000 строк). Советы или решения кто-нибудь? Было бы замечательно!


person MB123    schedule 03.06.2013    source источник
comment
Значит, поиск cumulative sum и r не привел вас к cumsum?   -  person joran    schedule 03.06.2013
comment
Протестировал в своем гугле и кажется, что это первое попадание. +1 Джоран :-)   -  person Tyler Rinker    schedule 03.06.2013


Ответы (1)


Функция cumsum() справится с задачей, но, поскольку вы хотите использовать ее для нескольких столбцов, вам нужно сначала получить сумму по строкам. Это можно сделать с помощью функции apply(). Предполагая, что я понимаю, что вы ищете, вот пример:

> set.seed(2)
> dat <- data.frame(a=round(rnorm(10),2),b=round(rnorm(10),2),c=round(rnorm(10),2))
> dat$cumsum <- cumsum(apply(dat,1,sum))
> dat
       a     b     c cumsum
1  -0.90  0.42  2.09   1.61
2   0.18  0.98 -1.20   1.57
3   1.59 -0.39  1.59   4.36
4  -1.13 -1.04  1.95   4.14
5  -0.08  1.78  0.00   5.84
6   0.13 -2.31 -2.45   1.21
7   0.71  0.88  0.48   3.28
8  -0.24  0.04 -0.60   2.48
9   1.98  1.01  0.79   6.26
10 -0.14  0.43  0.29   6.84
person David    schedule 03.06.2013
comment
Его сумма только по столбцу V2. - person Matthew Lundberg; 03.06.2013
comment
Тогда я неправильно понял вопрос, и его вопрос вообще не должен был быть задан. Без сомнения, существует множество примеров применения cumsum() к одной переменной. - person David; 03.06.2013
comment
Если бы ваша интерпретация была правильной (это не похоже), вероятно, было бы быстрее просто использовать cumsum(rowSums(dat)). - person IRTFM; 03.06.2013
comment
истинный. я часто забываю об этих одноразовых векторизованных функциях, таких как rowSums() - person David; 03.06.2013