具有不同行(相同标识符)的日期之间的月份差异(在 R 中)
Difference in months between dates with different rows (same identifier) (in R)
cpf sep_month hire_month hire_year sep_day hire_date sep_date
4 123 4 2 2012 1 2012-02-01 2013-04-01
5 123 0 4 2013 1 2013-04-01 <NA>
6 122 10 9 2012 1 2012-09-01 2013-10-01
7 122 0 12 2013 1 2013-12-01 <NA>
structure(list(cpf = c(123L, 123L, 122L, 122L), sep_month = c(4L,
0L, 10L, 0L), hire_month = c(2L, 4L, 9L, 12L), hire_year = c(2012L,
2013L, 2012L, 2013L), sep_day = c(1L, 1L, 1L, 1L), hire_date = structure(c(15371,
15796, 15584, 16040), class = "Date"), sep_date = structure(c(15796,
NA, 15979, NA), class = "Date")), row.names = 4:7, class = "data.frame")
在我的数据集中,每一行都是一份工作合同。我想查看 sep_date 和 hire_date 跨不同行的相同 CPF(标识符)之间的月数差异。
例如,个人 123 在 2013-04 年离职。在下一行,他于 2013-04 年被聘用(在不同的 contract/job 下)。我的目标是为脱离合同并在同月或下个月找到工作的个人创建一个等于 1 的虚拟变量。个人123是这样,个人122不是。
感谢任何帮助。
dplyr
library(dplyr)
dat %>%
group_by(cpf) %>%
mutate(dummy = sapply(sep_date, function(z) any(!is.na(z) & z <= hire_date))) %>%
ungroup()
# # A tibble: 4 x 8
# cpf sep_month hire_month hire_year sep_day hire_date sep_date dummy
# <int> <int> <int> <int> <int> <date> <date> <lgl>
# 1 123 4 2 2012 1 2012-02-01 2013-04-01 TRUE
# 2 123 0 4 2013 1 2013-04-01 NA FALSE
# 3 122 10 9 2012 1 2012-09-01 2013-10-01 TRUE
# 4 122 0 12 2013 1 2013-12-01 NA FALSE
如果你想让 dummy
真的只是 1
s 和 0
s,那么在它前面添加一个 +
,如 dummy = +sapply(...)
( +
是将 logical
转换为 integer
) 的快捷方式。
基础 R
dat$dummy <- ave(
seq_along(dat$cpf), dat$cpf,
FUN = function(i) sapply(dat$sep_date[i], function(z) any(!is.na(z) & z <= dat$hire_date[i])))
dat
# cpf sep_month hire_month hire_year sep_day hire_date sep_date dummy
# 4 123 4 2 2012 1 2012-02-01 2013-04-01 1
# 5 123 0 4 2013 1 2013-04-01 <NA> 0
# 6 122 10 9 2012 1 2012-09-01 2013-10-01 1
# 7 122 0 12 2013 1 2013-12-01 <NA> 0
这有点丑陋,因为 ave
不喜欢做 multi-column (multi-vector) 的事情,但它得到了相同的结果。
cpf sep_month hire_month hire_year sep_day hire_date sep_date
4 123 4 2 2012 1 2012-02-01 2013-04-01
5 123 0 4 2013 1 2013-04-01 <NA>
6 122 10 9 2012 1 2012-09-01 2013-10-01
7 122 0 12 2013 1 2013-12-01 <NA>
structure(list(cpf = c(123L, 123L, 122L, 122L), sep_month = c(4L,
0L, 10L, 0L), hire_month = c(2L, 4L, 9L, 12L), hire_year = c(2012L,
2013L, 2012L, 2013L), sep_day = c(1L, 1L, 1L, 1L), hire_date = structure(c(15371,
15796, 15584, 16040), class = "Date"), sep_date = structure(c(15796,
NA, 15979, NA), class = "Date")), row.names = 4:7, class = "data.frame")
在我的数据集中,每一行都是一份工作合同。我想查看 sep_date 和 hire_date 跨不同行的相同 CPF(标识符)之间的月数差异。 例如,个人 123 在 2013-04 年离职。在下一行,他于 2013-04 年被聘用(在不同的 contract/job 下)。我的目标是为脱离合同并在同月或下个月找到工作的个人创建一个等于 1 的虚拟变量。个人123是这样,个人122不是。
感谢任何帮助。
dplyr
library(dplyr)
dat %>%
group_by(cpf) %>%
mutate(dummy = sapply(sep_date, function(z) any(!is.na(z) & z <= hire_date))) %>%
ungroup()
# # A tibble: 4 x 8
# cpf sep_month hire_month hire_year sep_day hire_date sep_date dummy
# <int> <int> <int> <int> <int> <date> <date> <lgl>
# 1 123 4 2 2012 1 2012-02-01 2013-04-01 TRUE
# 2 123 0 4 2013 1 2013-04-01 NA FALSE
# 3 122 10 9 2012 1 2012-09-01 2013-10-01 TRUE
# 4 122 0 12 2013 1 2013-12-01 NA FALSE
如果你想让 dummy
真的只是 1
s 和 0
s,那么在它前面添加一个 +
,如 dummy = +sapply(...)
( +
是将 logical
转换为 integer
) 的快捷方式。
基础 R
dat$dummy <- ave(
seq_along(dat$cpf), dat$cpf,
FUN = function(i) sapply(dat$sep_date[i], function(z) any(!is.na(z) & z <= dat$hire_date[i])))
dat
# cpf sep_month hire_month hire_year sep_day hire_date sep_date dummy
# 4 123 4 2 2012 1 2012-02-01 2013-04-01 1
# 5 123 0 4 2013 1 2013-04-01 <NA> 0
# 6 122 10 9 2012 1 2012-09-01 2013-10-01 1
# 7 122 0 12 2013 1 2013-12-01 <NA> 0
这有点丑陋,因为 ave
不喜欢做 multi-column (multi-vector) 的事情,但它得到了相同的结果。