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