Как сделать строки во фрейме данных накопительными справа налево - PullRequest
0 голосов
/ 05 сентября 2018

У меня есть матрица, как

> A= [ 1 2 4
>      2 3 1
>      3 1 2 ]

и я хотел бы, чтобы результат накапливался по каждой строке справа налево, как:

> A= [ 7 6 4
>      6 4 1
>      6 3 2 ]

Я пытался использовать решение в Накопленная сумма в матрице , но это дает другой способ добавления матрицы.

Ответы [ 2 ]

0 голосов
/ 05 сентября 2018

Вы упомянули data.frame в заголовке, и есть способ использовать Reduce и rev с data.frame для получения желаемого результата.

A <- data.frame(c(1,2,3),c(2,3,1),c(4,1,2))
data.frame(rev(Reduce("+",rev(A),accumulate=TRUE)))
  c.7..6..6. c.6..4..3. c.4..1..2.
1          7          6          4
2          6          4          1
3          6          3          2
0 голосов
/ 05 сентября 2018

Немного волшебно, но:

t(apply(A,1,function(x) rev(cumsum(rev(x)))))

делает это.

  • apply(A, 1, FUN) применяет функцию к каждой строке матрицы.
  • rev() переворачивает вектор и cumsum() вычисляет кумулятивную сумму: нам нужно rev(cumsum(rev(x))), чтобы получить желаемый порядок
  • последний t() необходим для транспонирования результатов, потому что apply всегда возвращает свои результаты по столбцам , как (очень неясно) отмечено здесь (из раздела «Значение» ?apply ):

Если при каждом вызове «FUN» возвращается вектор длины «n», тогда «apply» возвращает массив измерения «c (n, dim (X) [MARGIN])», если «n> 1»

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...