首页 > 解决方案 > 为假期计算的转移金额到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 天的假期。任何帮助深表感谢。

标签: r

解决方案


工作代码,我会尝试改进它一点点。我给出了一个更长的例子来正确验证它。

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

推荐阅读