【问题标题】:Take differences between dates within id over a sequence (different rows) in R在 R 中的序列(不同行)上获取 id 内的日期之间的差异
【发布时间】:2022-02-12 00:25:18
【问题描述】:

我希望 - 对于每个 id (cpf) - 以月为单位计算前一行的hire_date 和 sep_date 之间的差异。例如,我想获取与订单 1 关联的租用日期和与订单 2 关联的 sep_date 之间的差异(对于具有两个以上订单值的 id 也是如此)。

并非所有观察都只有两个阶值。有些人可能有更多。我怎样才能编写一个代码来解决这个问题?在这种情况下,一个 id 有两行以上。所以我还需要做出不止一个改变。

我总是希望在给定的租用日期(例如订单 2)和之前的 sep_Date(订单 1)之间有所不同,依此类推。多于两行:hire_date (order 3) - sep_date (order 2);雇用日期(订单 2) - sep_date(订单 1)...

structure(list(cpf = c(234L, 234L, 245L, 245L, 245L, 555L, 555L
), hire_date = c("10-11-29", "13-7-29", "11-10-19", "13-3-20", 
"13-5-20", "10-02-18", "13-11-21"), sep_date = c("13-4-18", "13-8-29", 
"13-2-15", "13-4-20", NA, "13-10-20", NA), Order = c(1L, 2L, 
1L, 2L, 3L, 1L, 2L)), class = "data.frame", row.names = c(NA, 
-7L))

  cpf hire_date sep_date Order
1 234  10-11-29  13-4-18     1
2 234   13-7-29  13-8-29     2
3 245  11-10-19  13-2-15     1
4 245   13-3-20  13-4-20     2
5 245   13-5-20     <NA>     3
6 555  10-02-18 13-10-20     1
7 555  13-11-21     <NA>     2

任何帮助将不胜感激!

【问题讨论】:

    标签: r date sequence difference


    【解决方案1】:

    我们可以将日期列转换为Date 类并通过difftime 进行分组

    library(dplyr)
    library(lubridate)
    df1 %>%
      mutate(across(hire_date:sep_date, dmy)) %>% 
      group_by(cpf) %>% 
      mutate(Month = as.numeric(difftime(hire_date, 
         lag(sep_date), unit = "weeks"))/4) %>%
      ungroup
    

    【讨论】:

    • 非常感谢!但并非所有观察结果都只有两个阶值。有些人可能有更多。我怎样才能编写一个代码来解决这个问题?在这种情况下,一个 id 有两行以上。所以我还需要做出不止一个改变。
    • @Rnovice 您没有提到输出到达的逻辑,即如果超过两行,输出将是什么。同样,如果其中一个的长度与另一个不同
    • 我总是希望在给定的hire_date(例如订单 2)和之前的 sep_Date(订单 1)之间有所不同,依此类推。超过两行:hire_date (order 3) - sep_date (order 2);雇用日期(订单 2) - sep_date(订单 1)...
    • @Rnovice 你想要difftimelagmutate(Month = as.numeric(difftime(hire_date, lag(sep_date), unit = "weeks"))/4)
    • @Rnovice 这是我早期的解决方案,但是当我在您的帖子中看到基于订单的逻辑时,我将其更改为您的解决方案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多