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

Create column with first element of other column per month in R

我有以下数据集

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',对于 'NoEmployees',它们的值分别为 5、7 和 3。所以我想要的输出应该如下所示:

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 

关于如何做到这一点有什么想法吗?

编辑::分组应发生在月-年级别,而不是仅月。

转换为Dateclass后提取月份,对其分组,得到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")))]

使用 base 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),以获得相同的结果,但使用上述方法更直接。