r - 为假期计算的转移金额到R中假期前的最后一天
问题描述
假设我有一个这样的data.frame:
df <- data.frame(Day = c("2020-21-12", "2020-22-12", "2020-23-12", "2020-24-12","2020-25-12"), Amount = c(1000, 1000, 1000, 1000, 1000), Holiday=(0,0,0,1,1))
现在我想将每个假期 (Holiday=1) 列中的值转移到不是假期的最后一天,并将假期的金额设置为零。
输出应如下所示:
df_output <- data.frame(Day = c("2020-21-12", "2020-22-12", "2020-23-12", "2020-24-12","2020-25-12"), Amount = c(1000, 1000, 3000, 0, 0), Holiday=(0,0,0,1,1))
我尝试使用循环,但这既不高效也不优雅,因为最多可以有连续 3 天的假期。任何帮助深表感谢。
解决方案
工作代码,我会尝试改进它一点点。我给出了一个更长的例子来正确验证它。
df <- data.frame( Day = c("2020-21-12", "2020-22-12", "2020-23-12", "2020-24-12","2020-25-12","2020-26-12","2020-27-12","2020-28-12","2020-29-12"),
Amount = c(1000, 1000, 1000, 1000, 1000, 1000, 1000,1000,1000),
Holiday=c(0,0,0,1,1,0,1,0,1))
df$nH <- !as.logical(df$Holiday)
df$nH_c <- cumsum(df$nH)
df$Amount_c <- df$Amount
which_h <- which(!as.logical(df$Holiday))
for (i in seq_len(nrow(df))) {
df$Amount_c[which_h[df$nH_c[i]]] <- df$Amount_c[which_h[df$nH_c[i]]] + df$Amount[i]
df$Amount_c[i] <- df$Amount_c[i] - df$Amount[i]
}
> df
Day Amount Holiday nH nH_c Amount_c
1 2020-21-12 1000 0 TRUE 1 1000
2 2020-22-12 1000 0 TRUE 2 1000
3 2020-23-12 1000 0 TRUE 3 3000
4 2020-24-12 1000 1 FALSE 3 0
5 2020-25-12 1000 1 FALSE 3 0
6 2020-26-12 1000 0 TRUE 4 2000
7 2020-27-12 1000 1 FALSE 4 0
8 2020-28-12 1000 0 TRUE 5 2000
9 2020-29-12 1000 1 FALSE 5 0
推荐阅读
- xcode - ld:在 Big Sur 上找不到 -lcrypto 的库
- azure-data-explorer - 测量使用 Kusto Query 执行的命令的成功率
- html - 如果他们有超过 x 个孩子,则将 css 应用于父母
- c# - 如何从 Model 类中获取对 HtmlHelper 的引用?
- mysql - 在数据库架构中存储不同类型的文档
- c++ - 根据 C++ 中的输入创建文件并为其命名
- node.js - 如何从节点中的 express 访问 .env 变量?
- r - 如何对相似的字符串进行分组并为 R 中的每个组创建索引变量?
- python - Pandas 数据框列需要作为输入传递给另一个函数
- sql - 如何将函数从熊猫时间重写为sql?