r - 如何在 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)
解决方案
我们也可以使用accumulate
frompurrr
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 R
与by
和一起使用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
))
推荐阅读
- r - 调整 R Markdown PDF 文档中文本和块输出之间的间距
- powershell - Windows 10 的 powershell 中的电子邮件功能操作已超时
- c# - 在 c# 中执行 StreamReader 时添加的空行
- angular - jHipster 项目中的自动完成表单
- python - 为什么我的 JSON 在每个结果之后返回 NULL 行?
- powershell - 将值存储在同一个文件中
- python - 使用随机文本文件中的字典链接房间 - 冒险游戏
- isabelle - 用计数器证明求和函数的正确性
- sql - 我需要一些关于 plsql 函数的帮助
- android - 如何处理 Retrofit 中延迟等待错误的异常