如何计算两个日期之间的持续时间

时间:2020-06-11 20:23:38

标签: r datetime dplyr tidyr mutate

我正在RStudio中使用大型数据集,其中包括针对同一个人的多个测试成绩。我过滤了我的数据集,以在连续的两行中显示同一个人的分数,并在每一列中显示了每个考试管理的考试日期。我的数据如下:

id  test_date     score    baseline_number_1    baseline_number_2 
1   08/15/2017    21.18          Baseline             N/A
1   08/28/2019    28.55             N/A             Baseline
2   11/22/2017    33.38          Baseline             N/A
2   11/06/2019    35.3              N/A             Baseline
3   07/25/2018    30.77          Baseline             N/A
3   07/31/2019    33.42             N/A             Baseline

我想计算基线1和基线2管理之间的总时间长度,并将该值存储在新列中。因此,我的第一个问题是计算两个日期之间的持续时间的最佳方法是什么?第二,将每个人的数据压缩到一行以使计算分数之间的差异更容易并将其存储在新列中的最佳方法是什么?

谢谢您的帮助!

1 个答案:

答案 0 :(得分:0)

这是tidyverse宇宙内部的解决方案。我们将使用的软件包为dplyrtidyr

首先,我们创建数据集(您从文件中读取数据集)并将字符串转换为日期格式:

library(dplyr)
library(tidyr)

dataset <- read.table(text = "id  test_date     score    baseline_number_1    baseline_number_2 
1   08/15/2017    21.18          Baseline             N/A
1   08/28/2019    28.55             N/A             Baseline
2   11/22/2017    33.38          Baseline             N/A
2   11/06/2019    35.3              N/A             Baseline
3   07/25/2018    30.77          Baseline             N/A
3   07/31/2019    33.42             N/A             Baseline", header = TRUE)
dataset$test_date <- as.Date(dataset$test_date, format = "%m/%d/%Y")

#   id  test_date score baseline_number_1 baseline_number_2
# 1  1 2017-08-15 21.18          Baseline              <NA>
# 2  1 2019-08-28 28.55              <NA>          Baseline
# 3  2 2017-11-22 33.38          Baseline              <NA>
# 4  2 2019-11-06 35.30              <NA>          Baseline
# 5  3 2018-07-25 30.77          Baseline              <NA>
# 6  3 2019-07-31 33.42              <NA>          Baseline

将每个人的数据压缩为一行并计算两个基准之间的差异的最佳解决方案可以实现如下:

dataset %>% 
  group_by(id) %>% 
  mutate(number = row_number()) %>% 
  ungroup() %>% 
  pivot_wider(
    id_cols = id,
    names_from = number, 
    values_from = c(test_date, score), 
    names_glue = "{.value}_{number}"
    ) %>% 
  mutate(
    time_between = test_date_2 - test_date_1
  )

简要说明:首先,我们创建变量number,该变量指示每行中的基线号;然后我们使用pivot_wider来使数据集确实“更宽”,即每个id及其特征都有一行;最后,我们创建变量time_between,该变量包含两个基准之间的天数差异。如果您不熟悉其中的某些功能,建议您在每次操作后中断管道,并逐步进行分析。

最终输出

# A tibble: 3 x 6
#      id test_date_1 test_date_2 score_1 score_2 time_between
#   <int> <date>      <date>        <dbl>   <dbl> <drtn>      
# 1     1 2017-08-15  2019-08-28     21.2    28.6 743 days    
# 2     2 2017-11-22  2019-11-06     33.4    35.3 714 days    
# 3     3 2018-07-25  2019-07-31     30.8    33.4 371 days