这是一个示例数据框,我必须将假日音量添加到下一个工作日的音量:
> emp.data
sno date volume day
1 1 2016-02-21 10 Mon
2 2 2016-02-22 20 Tue
3 3 2016-02-23 30 Wed
4 4 2016-02-24 40 Thu
5 5 2016-02-25 50 Fri
6 6 2016-02-26 5 Sat
7 7 2016-02-27 8 Sun
8 8 2016-02-28 10 Mon
9 9 2016-03-01 20 Tue
10 10 2016-03-02 30 Wed
11 11 2016-03-03 40 Thu
12 12 2016-03-04 50 Fri
13 13 2016-03-05 5 Sat
14 14 2016-03-06 8 Sun
15 15 2016-03-07 10 Mon
在这里,我需要添加每个星期六和星期六。太阳量到周一音量。我这样做是通过查找Mon的行索引并添加到它(向量处理)。
但问题是,如果第一天从太阳开始 - 我们只需要将太阳卷添加到周一,因为没有星期六。同样,如果开始日是星期一和结束日也是星期一,则星期一矢量长度大于星期六和星期五。太阳矢量回收发生的地方。
对于之前令人困惑的帖子感到抱歉。希望这会使问题变得简单。
答案 0 :(得分:0)
这是一种使用dplyr
包的方法。
我们使用case_when
函数来定义将周六和周日的卷添加到星期一时必须满足的条件。
那就是什么时候:没有星期天,没有星期六,星期六和星期日都有。
结果存储在holiday_volume
列中。
mutate(emp.data,
holiday_volume = case_when(
is.na(lag(.$day)) & .$day == "Mon" ~ .$volume,
is.na(lag(.$day, 2)) & .$day == "Mon" ~ .$volume + lag(.$volume),
!is.na(lag(.$day)) & .$day == "Mon"~ .$volume + lag(.$volume) + lag(.$volume, 2)
))
答案 1 :(得分:0)
感谢您的回答。
在做了一些研究和其他一些帖子之后,我得到了这个答案。 (我不知道为什么但是这里的一个答案被删除了?但是这个答案只是在经过一些修改之后才基于这个答案)
library(tidyverse)
emp.data_subset<-subset(emp.data[,c("day","volume")])
emp.data_subset$lag1<-lag(emp.data_subset$volume,1,default = 0)
emp.data_subset$lag2<-lag(emp.data_subset$volume,2,default = 0)
emp.data$volume<-ifelse(
emp.data_subset$day=="Mon",
emp.data_subset$volume+emp.data_subset$lag1+emp.data_subset$lag2,
emp.data_subset$volume
)
这里“emp.data_subset”为了便于操作,在执行两个滞后列之后看起来像这样。
> emp.data_subset
day volume lag1 lag2
1 Mon 10 0 0
2 Tue 20 10 0
3 Wed 30 20 10
4 Thu 40 30 20
5 Fri 50 40 30
6 Sat 5 50 40
7 Sun 8 5 50
8 Mon 10 8 5
9 Tue 20 10 8
10 Wed 30 20 10
11 Thu 40 30 20
12 Fri 50 40 30
13 Sat 5 50 40
14 Sun 8 5 50
15 Mon 10 8 5
添加“emp.data_subset”卷,lag1&amp; “Mon”到“mon.data $ volume”的lag2表示结果。
最终“emp.data”将如下所示:
> emp.data
sno date volume day
1 1 2016-02-21 10 Mon
2 2 2016-02-22 20 Tue
3 3 2016-02-21 30 Wed
4 4 2016-02-22 40 Thu
5 5 2016-02-20 50 Fri
6 6 2016-02-21 5 Sat
7 7 2016-02-22 8 Sun
8 8 2016-02-20 23 Mon
9 9 2016-02-20 20 Tue
10 10 2016-02-20 30 Wed
11 11 2016-02-21 40 Thu
12 12 2016-02-22 50 Fri
13 13 2016-02-21 5 Sat
14 14 2016-02-22 8 Sun
15 15 2016-02-20 23 Mon