具有不同行(相同标识符)的日期之间的月份差异(在 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 真的只是 1s 和 0s,那么在它前面添加一个 +,如 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) 的事情,但它得到了相同的结果。