首页 > 解决方案 > 用“没有答案”和“太早”替换日期

问题描述

我正在尝试找出调查中的日期。该调查有 4 个阶段,基线、30 天、60 天和 90 天,超过 1000 行。基线阶段是我想要作为参考的阶段,以检查它是否在 30,60 和 90 天更新。如果在 30/60/90days 中更新了超过 30/60/90days 的列,则没有问题,如果它有一个有效的日期。

两个可能的答案:

  1. 没有答案:这意味着如果我们添加 30/60/90 天,则从基线日期开始,我没有任何日期
  2. 太早:这意味着如果我们添加 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 天,因此可以回答的是“没有答案”。

标签: rdate

解决方案


如果没有明确指出参考日期,就不可能分配“无答复”或“太早”的状态。例如,如果今天是 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 

推荐阅读