r - 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 为正(永远记录)-> 然后找到它第一次变为负的时间。并将增量推送到一列。
任何提示+帮助表示赞赏。
解决方案
您可以编写一个函数来执行此计算。获取第一个日期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
推荐阅读
- google-app-engine - 使用 opencensus ext 时出现 Google App Engine 错误
- bash - 省略heredoc的注释
- python - 无法通过串口从 micro-python repl 挂载 sd 卡
- bash - 将填充零添加到名称文件
- haskell - 在大型 Pandoc 中有效地搜索单个元素
- reactjs - 前端-后端数据集成和获取的模式/方法
- c# - ASP.NET MVC 站点偶尔以随机 RESX 语言呈现 - 可能的 DI 问题?
- javascript - Puppeteer 刷新直到选择器值改变?
- python - Python Mysql 1.2.5 安装不起作用 Pycharm
- python - 加载并准备一个新数据集