R: кумулятивно умножить строки df в списке и вернуть список из операции - PullRequest
1 голос
/ 30 сентября 2019

У меня есть список факторов и начальное базовое число (т.е. 100), я хотел бы умножить основание на коэффициент 1, чтобы заполнить первую факторизованную позицию, а затем иметь возможность использовать первую позицию и умножить ее намножитель 2, выведите его и умножьте результат на коэффициент 3, выведите соответственно. Пожалуйста, смотрите пример данных и код ниже для деталей.

Пример данных:

base <- 100

myList3 <- list()
myList3[[1]]<- as.data.frame(matrix(c(1,1,1,1,2,3,1,0.9,0.8), nrow=3, ncol=3))
myList3[[2]]<- as.data.frame(matrix(c(2,2,2,1,2,3,1,0.8,0.7), nrow=3, ncol=3))
myList3[[3]]<- as.data.frame(matrix(c(3,3,3,1,2,3,1,0.8,0.9), nrow=3, ncol=3))
colnames <- c("path","month", "factor")
factor<-lapply(myList3, setNames,colnames)
print(factor)
> print(factor)
[[1]]
  path month factor
1    1     1    1.0
2    1     2    0.9
3    1     3    0.8

[[2]]
  path month factor
1    2     1    1.0
2    2     2    0.8
3    2     3    0.7

[[3]]
  path month factor
1    3     1    1.0
2    3     2    0.8
3    3     3    0.9

Попытка написать функцию, не работает

Function <- function(x,y) {
  for (k in 2:100){
    x[1,3] <- base
    x[k,3] <- x[k-1,3]*y[k,3]
  }
  return(x)
}

x <- lapply(Function,x,y)

Желаемый вывод:

myList3 <- list()
myList3[[1]]<- as.data.frame(matrix(c(1,1,1,1,2,3,100,90,72), nrow=3, ncol=3))
myList3[[2]]<- as.data.frame(matrix(c(2,2,2,1,2,3,100,80,56), nrow=3, ncol=3))
myList3[[3]]<- as.data.frame(matrix(c(3,3,3,1,2,3,100,80,72), nrow=3, ncol=3))
colnames <- c("path","month", "data")
data<-lapply(myList3, setNames,colnames)
print(data)
> print(data)
[[1]]
  path month data
1    1     1  100
2    1     2   90
3    1     3   72

[[2]]
  path month data
1    2     1  100
2    2     2   80
3    2     3   56

[[3]]
  path month data
1    3     1  100
2    3     2   80
3    3     3   72

1 Ответ

1 голос
/ 30 сентября 2019

Мы можем использовать transform с cumprod

lapply(factor, transform, factor = cumprod(factor) * 100)
#[[1]]
#  path month factor
#1    1     1    100
#2    1     2     90
#3    1     3     72

#[[2]]
#  path month factor
#1    2     1    100
#2    2     2     80
#3    2     3     56

#[[3]]
#  path month factor
#1    3     1    100
#2    3     2     80
#3    3     3     72

или другой вариант Reduce с *

lapply(factor, transform, factor = 100 * Reduce(`*`, factor, accumulate = TRUE))

Опция tidyverseбудет

library(dplyr)
library(purrr)
map(factor, ~ .x %>%
                  mutate(factor = cumprod(factor) * 100))

ПРИМЕЧАНИЕ. Лучше не называть имена объектов или столбцов именами функций (factor - это функция)

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