我有以下数据集
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
关于如何做到这一点的任何想法?
编辑::分组应该在月 - 而不是仅仅一个月的水平上进行。
答案 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对象,因此我使用grepl
和cumsum
进行分组。您也可以将此向量转换为日期(使用as.Date(dat$Date, "%d-%m-%y")
)并提取日期(使用format
),以获得相同的结果,但使用上述方法更为直接。