在R中每月创建具有其他列的第一个元素的列

时间:2017-09-08 09:48:14

标签: r data.table plyr

我有以下数据集

ID    Date      NoEmployees
1     01-01-16  5
2     03-01-16  4
3     08-01-16  6
4     01-01-17  6
5     01-02-17  7
6     05-02-18  5 
7     06-02-18  4
8     01-03-18  3
9     01-04-18  4 

我想创建一个额外的列,每月显示本月初的“NoEmployees”,所以当“Date”的前两个字符为“01”时。在这个例子中有3个月表示:'01','02'和'03',其值为5,7和3,分别针对'NoEmployees'。所以我想要的输出应该如下所示:

ID    Date      NoEmployees    NoEployeesAtStart
1     01-01-16  5              5 
2     03-01-16  4              5
3     08-01-16  6              5
4     01-01-19  6              6
4     01-02-17  7              7
5     05-02-18  5              7
6     06-02-18  4              7
7     01-03-18  3              3
8     01-04-18  4              4 

关于如何做到这一点的任何想法?

编辑::分组应该在月 - 而不是仅仅一个月的水平上进行。

2 个答案:

答案 0 :(得分:3)

我们可以在转换为Date类后对其进行提取,对其进行分组并获取first元素

library(lubridate)
library(dplyr)
df1 %>%
      group_by(month = month(dmy(Date))) %>%
      mutate(NoEmployeesAtStart = first(NoEmployees)) %>%
      ungroup %>%
      select(-month)

data.table

library(data.table)
setDT(df1)[, NoEmployeesAtStart := NoEmployees[1], .(month = month(dmy(Date)))]

或者@lmo建议,我们可以as.IDate代替dmy

setDT(df1)[, NoEmployeesAtStart := NoEmployees[1], 
                .(month = month(as.IDate(Date, "%d-%m-%y")))]

答案 1 :(得分:2)

使用基数R,您可以使用ave和索引:

ave(dat$NoEmployees, cumsum(grepl("^01", dat$Date)), FUN=function(x) x[1])
[1] 5 5 5 7 7 7 3 4

由于Date变量不是Date对象,因此我使用greplcumsum进行分组。您也可以将此向量转换为日期(使用as.Date(dat$Date, "%d-%m-%y"))并提取日期(使用format),以获得相同的结果,但使用上述方法更为直接。