首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >计算的节假日到节假日前的最后一天的轮班金额

计算的节假日到节假日前的最后一天的轮班金额
EN

Stack Overflow用户
提问于 2020-09-22 01:29:23
回答 2查看 54关注 0票数 1

假设我有一个这样的data.frame:

代码语言:javascript
复制
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)中的值移动到非假日的最后一天,并将假日的金额设置为零。

输出应如下所示:

代码语言:javascript
复制
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天的假期。任何帮助都是非常感谢的。

EN

回答 2

Stack Overflow用户

发布于 2020-09-22 02:05:15

工作的代码,我会试着改进它一点。我给出一个稍微长一点的例子来正确地验证它。

代码语言:javascript
复制
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
票数 1
EN

Stack Overflow用户

发布于 2020-09-22 02:07:57

以下是一种dplyr方式:

代码语言:javascript
复制
library(tidyverse)

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 %>% 
   arrange(desc(Day)) %>%
   mutate(lagsum = ifelse(lag(Holiday, default = 0) == 1, 
                   Amount + lag(Amount, default = 0), 
                   Amount)) %>%
  mutate(Amount2 = ifelse(Holiday == 0 & lag(Holiday) == 1, 
                   Amount + dplyr::lag(lagsum, default = 0),
                   Amount),
        Amount2 = ifelse(Holiday == 1, 0, Amount2)) %>%
   arrange(Day) %>%
   select(Day, Amount = Amount2, Holiday)
  

        Day Amount Holiday
1 2020-21-12   1000       0
2 2020-22-12   1000       0
3 2020-23-12   3000       0
4 2020-24-12      0       1
5 2020-25-12      0       1
6 2020-26-12   2000       0
7 2020-27-12      0       1
8 2020-28-12   2000       0
9 2020-29-12      0       1
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63997242

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档