在R数据帧中进行数据处理

时间:2017-03-13 06:50:00

标签: r

这是一个示例数据框,我必须将假日音量添加到下一个工作日的音量:

> 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的行索引并添加到​​它(向量处理)。

但问题是,如果第一天从太阳开始 - 我们只需要将太阳卷添加到周一,因为没有星期六。同样,如果开始日是星期一和结束日也是星期一,则星期一矢量长度大于星期六和星期五。太阳矢量回收发生的地方。

对于之前令人困惑的帖子感到抱歉。希望这会使问题变得简单。

2 个答案:

答案 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