r - 用“没有答案”和“太早”替换日期
问题描述
我正在尝试找出调查中的日期。该调查有 4 个阶段,基线、30 天、60 天和 90 天,超过 1000 行。基线阶段是我想要作为参考的阶段,以检查它是否在 30,60 和 90 天更新。如果在 30/60/90days 中更新了超过 30/60/90days 的列,则没有问题,如果它有一个有效的日期。
两个可能的答案:
- 没有答案:这意味着如果我们添加 30/60/90 天,则从基线日期开始,我没有任何日期
- 太早:这意味着如果我们添加 30/60/90 天,则从基线日期开始响应太早
目前 df 看起来像这样:
基线 | 日期_30d | 日期_60d | 日期_90d |
---|---|---|---|
2019-06-01 | 2019-07-1 | 不适用 | 不适用 |
2019-06-03 | 2019-07-3 | 不适用 | 不适用 |
2019-05-20 | 不适用 | 不适用 | 不适用 |
2019-07-01 | 2019-08-1 | 2019-09-1 | 2019-10-1 |
2019-05-01 | 2019-06-1 | 2019-07-1 | 不适用 |
我想要的是:
基线 | 日期_30d | 日期_60d | 日期_90d |
---|---|---|---|
2019-06-01 | 2019-07-1 | 太早了 | 太早了 |
2019-06-03 | 2019-07-3 | 没有答案 | 没有答案 |
2019-05-20 | 没有答案 | 没有答案 | 没有答案 |
2019-07-01 | 2019-08-1 | 2019-09-1 | 太早了 |
2019-05-01 | 2019-06-1 | 2019-07-1 | 没有答案 |
一个解释:
对于第一行:基线阶段发生在 2019 年 6 月 1 日,2019 年 7 月 1 日的 30 天,但对于 60 天和 90 天的响应还为时过早。
对于第二行:基线阶段发生在 2019 年 6 月 3 日,30_d 发生在 2019 年 7 月 3 日,但 60 和 90 天的列已经过了 60 天和 90 天,因此可以回答的是“没有答案”。
解决方案
如果没有明确指出参考日期,就不可能分配“无答复”或“太早”的状态。例如,如果今天是 2021 年 11 月 8 日,Dates_90d
数据框中的列NA
是“没有答案”,但如果今天是 2019 年 8 月 1 日,则“为时过早”。我冒昧地选择了 2019 年 8 月 1 日作为参考。
library(tidyverse)
library(lubridate)
df <- read_table("
Baseline Dates_30d Dates_60d Dates_90d
2019-06-01 2019-07-01 NA NA
2019-06-03 2019-07-03 NA NA
2019-05-20 NA NA NA
2019-07-01 2019-08-01 2019-09-01 2019-10-01
2019-05-01 2019-06-01 2019-07-01 NA", col_types = "DDDD")
# I put for the sake of the test
# the date which is relevent to
# the time frame of the survey.
# in general it should be
# tday <- today()
tday <- ymd("2019-08-01")
early <- function(bl, date, n, tday) {
if(!is.na(date))
r <- as.character(date)
else if(tday - bl < n)
r <- "too early"
else
r <- "no answer"
r
}
df %>% rowwise() %>%
mutate(status_30d = early(Baseline, Dates_30d, 30, tday),
status_60d = early(Baseline, Dates_60d, 60, tday),
status_90d = early(Baseline, Dates_90d, 90, tday))
输出:
# A tibble: 5 x 7
# Rowwise:
Baseline Dates_30d Dates_60d Dates_90d status_30d status_60d status_90d
<date> <date> <date> <date> <chr> <chr> <chr>
1 2019-06-01 2019-07-01 NA NA 2019-07-01 no answer too early
2 2019-06-03 2019-07-03 NA NA 2019-07-03 too early too early
3 2019-05-20 NA NA NA no answer no answer too early
4 2019-07-01 2019-08-01 2019-09-01 2019-10-01 2019-08-01 2019-09-01 2019-10-01
5 2019-05-01 2019-06-01 2019-07-01 NA 2019-06-01 2019-07-01 no answer
推荐阅读
- android - Android Firebase Crashlytics 显示内部测试轨道没有崩溃
- c# - Visual Studio:是否有设置一次删除一个选项卡的空白?
- java - 不是“不安全操作”错误:不兼容的类型 Object 无法转换为 Entry
- chef-infra - 如何解决同步食谱错误:?
- android - 如何跟踪 flowable 中的发射次数?
- javascript - 如何在顶级的javascript中等待异步函数?
- android - 每种语言的Android不同字体
- c++ - 通过 C++ 中的迭代器改变集合中的集合
- javascript - 与声明常规类相比,声明功能类有什么好处
- python - 尝试从 selenium 使用 webdriver 时出现问题