首页 > 解决方案 > R组中的列值更改查找日期差异

问题描述

假设我有以下 DataFrame

ID    Result    Date
1      Pos      4th Jan, 2020
1      Pos      20th Jan, 2020
1      Neg      21st Jan, 2020
2      Pos      5th Jan, 2020
2      Neg      7th Jan, 2020

当结果从正变为负时,我想按 ID记录增量(天之间)

所以我想要这个测试用例的答案:

ID    Result    Date               Delta    Time_Spent_Pos
1      Pos      4th Jan, 2020          0              17
1      Pos      20th Jan, 2020        16              17
1      Neg      21st Jan, 2020        17              17
2      Pos      5th Jan, 2020          0               2
2      Neg      7th Jan, 2020          2               2

我打算在哪里使用 time_spent_pos 列进行进一步分析。

进一步测试案例

我还想指出数据可能看起来像

ID    Result    Date
1      Neg      12th Dec, 2019
1      Pos      4th Jan, 2020
1      Pos      20th Jan, 2020
1      Neg      21st Jan, 2020
2      Neg      2nd Jan, 2020
2      Pos      5th Jan, 2020
2      Neg      7th Jan, 2020

在这种情况下,我仍然想要旧的输出。因此,重要的是找到第一次 ID 为正(永远记录)-> 然后找到它第一次变为负的时间。并将增量推送到一列。

任何提示+帮助表示赞赏。

标签: rdplyrgroup-by

解决方案


您可以编写一个函数来执行此计算。获取第一个日期result = 'Pos'并从下一个日期中减去它'Neg'

get_delta <- function(res, date) {
  d1 <- date[match('Pos', res)]  
  as.integer(min(date[res == 'Neg' & date > d1]) - d1)
}

library(dplyr)

df %>%
  mutate(Date = lubridate::dmy(Date)) %>%
  group_by(ID) %>%
  mutate(Time_Spent_Pos = get_delta(Result, Date)) %>%
  ungroup

#     ID Result Date       Time_Spent_Pos
#  <int> <chr>  <date>     <int>
#1     1 Pos    2020-01-04    17
#2     1 Pos    2020-01-20    17
#3     1 Neg    2020-01-21    17
#4     2 Pos    2020-01-05     2
#5     2 Neg    2020-01-07     2

推荐阅读