накопленный продукт в R через колонку - PullRequest
0 голосов
/ 08 мая 2019

У меня есть фрейм данных в следующем формате

> x <- data.frame("a" = c(1,1),"b" = c(2,2),"c" = c(3,4))
> x
  a b c
1 1 2 3
2 1 2 4

Я хотел бы добавить 3 новых столбца, которые являются совокупным произведением столбцов abc, однако мне нужен обратный накопительный продукт, т.е. вывод долженбыть

row 1:
result_d = 1*2*3 = 6 , result_e = 2*3 = 6, result_f = 3

и аналогично для строки 2

Конечный результат будет

  a b c result_d result_e result_f
1 1 2 3        6        6        3
2 1 2 4        8        8        4

имена столбцов не имеют значения, это всего лишь пример.У кого-нибудь есть идеи, как это сделать?

согласно моему комментарию, возможно ли сделать это на подмножестве столбцов?например, только для столбцов b и c для возврата:

  a b c results_e results_f
1 1 2 3         6         3
2 1 2 4         8         4

, чтобы столбец "a" эффективно игнорировался?

Ответы [ 2 ]

2 голосов
/ 08 мая 2019

Один из вариантов - циклически проходить по строкам и применять cumprod к элементу rev, а затем выполнить rev erse

nm1 <- paste0("result_", c("d", "e", "f"))
x[nm1] <- t(apply(x, 1, 
              function(x) rev(cumprod(rev(x)))))
x
#  a b c result_d result_e result_f
#1 1 2 3        6        6        3
#2 1 2 4        8        8        4

Или векторизация rowCumprods

library(matrixStats)
x[nm1] <- rowCumprods(as.matrix(x[ncol(x):1]))[,ncol(x):1]
0 голосов
/ 08 мая 2019
temp = data.frame(Reduce("*", x[NCOL(x):1], accumulate = TRUE))
setNames(cbind(x, temp[NCOL(temp):1]),
         c(names(x), c("res_d", "res_e", "res_f")))
#  a b c res_d res_e res_f
#1 1 2 3     6     6     3
#2 1 2 4     8     8     4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...