首页 > 解决方案 > 如何在 R 中创建一个数据框,其列计算引用了前一行中自己的值?

问题描述

我尝试使用 R 来计算销售额作为库存的函数作为销售额的函数。请参阅下面的数据快照。有没有办法计算这个?

Group、Day 和 Build 是自变量 Sales = lag(Sales,1) * Build

我得到了这个数据框:

Group <- c("A","A","A","A","A","B","B","B","B","B")
Day <- c(1,2,3,4,5,1,2,3,4,5)
Build <- c(1.5,2,.3,.5,.6,1.2,.9,1.2,1.2,.4)
Sales <- c(50000,NA,NA,NA,NA,20000,NA,NA,NA,NA)

尝试填充此数据框:

Group <- c("A","A","A","A","A","B","B","B","B","B")
Day <- c(1,2,3,4,5,1,2,3,4,5)
Build <- c(1.5,2,.3,.5,.6,1.2,.9,1.2,1.2,.4)
Sales <- c(50000,100000,30000,15000,9000,20000,18000,21600,25920,10368)

标签: rfor-looprolling-computation

解决方案


我们也可以使用accumulatefrompurrr

library(dplyr)
library(purrr)
df1 %>% 
  group_by(Group) %>%
  mutate(Sales = accumulate(Build[-1], ~ .y * .x, .init = first(Sales)))
# A tibble: 10 x 4
# Groups:   Group [2]
#   Group   Day Build  Sales
#   <fct> <dbl> <dbl>  <dbl>
# 1 A         1   1.5  50000
# 2 A         2   2   100000
# 3 A         3   0.3  30000
# 4 A         4   0.5  15000
# 5 A         5   0.6   9000
# 6 B         1   1.2  20000
# 7 B         2   0.9  18000
# 8 B         3   1.2  21600
# 9 B         4   1.2  25920
#10 B         5   0.4  10368

base Rby和一起使用Reduce

df1$Sales <- do.call(c, by(df1[3:4], df1$Group, FUN = 
    function(dat) Reduce(function(x, y) x * y,
    dat$Build[-1], init = dat$Sales[1], accumulate = TRUE)))

数据

df1 <- structure(list(Group = structure(c(1L, 1L, 1L, 1L, 1L, 2L, 2L, 
2L, 2L, 2L), .Label = c("A", "B"), class = "factor"), Day = c(1, 
2, 3, 4, 5, 1, 2, 3, 4, 5), Build = c(1.5, 2, 0.3, 0.5, 0.6, 
1.2, 0.9, 1.2, 1.2, 0.4), Sales = c(50000, NA, NA, NA, NA, 20000, 
NA, NA, NA, NA)), class = "data.frame", row.names = c(NA, -10L
))

推荐阅读