R:迭代一系列日期以创建多个间隔

R: Iterating over a series of dates to create multiple intervals

晚上好。我正在寻找一个更简单的解决方案来解决我对数据集的模糊任务。我已经使用 dplyr 解决了它,但我想知道社区中是否有人有更优雅的解决方案,可能使用 purrr 来启发我自己。

我这里有一个玩具数据集,其中包含 3 个研究 ID 和 3 个药物剂量日期。一剂是 NA。我想生成 2 个新变量:一个名为 "int_1" 以表示前两次剂量之间的时间间隔,然后是 "int_2" 以表示第二次和第三次剂量之间的时间间隔。

library(dplyr)
library(lubridate)
study_id <- c(1001, 1002, 1003)
dose_1 <- c('1/1/10', '2/3/12', '1/1/13')
dose_2 <- c('1/10/10', '2/4/12', '1/2/13')
dose_3 <- c(NA, '3/1/12', '2/2/13')
df <- tibble(study_id, dose_1, dose_2, dose_3)
df <- df %>% 
  mutate_at(vars(contains('dose')),
            funs(mdy))

# A tibble: 3 x 4
  study_id dose_1     dose_2     dose_3    
     <dbl> <date>     <date>     <date>    
1     1001 2010-01-01 2010-01-10 NA        
2     1002 2012-02-03 2012-02-04 2012-03-01
3     1003 2013-01-01 2013-01-02 2013-02-02

获得以下内容(仅显示第一个间隔)的最简单解决方案是什么。这里我使用了我熟悉的dplyr/lubridate方法。实际上,我有 42 种不同的剂量,所以我正在寻找比复制和粘贴以下代码 41 次更容易的方法来制作不同的间隔。我也需要一些可以处理缺失剂量的东西。

df <- df %>% 
  mutate(int_1 = interval(dose_1, dose_2),
         int_1 = int_1/months(1))

# A tibble: 3 x 5
  study_id dose_1     dose_2     dose_3      int_1
     <dbl> <date>     <date>     <date>      <dbl>
1     1001 2010-01-01 2010-01-10 NA         0.290 
2     1002 2012-02-03 2012-02-04 2012-03-01 0.0345
3     1003 2013-01-01 2013-01-02 2013-02-02 0.0323

非常感谢这种蛮力方法的任何替代方法。咕噜声里有东西吗?

一般情况下最好先有long格式的数据再进行计算

library(dplyr)
library(tidyr)
library(lubridate)

df %>%
  pivot_longer(cols = -study_id, names_to = 'dose') %>%
  group_by(study_id) %>%
  mutate(temp = interval(value, lead(value))/months(1)) %>%
  mutate(int = paste0('int', row_number())) %>%
  pivot_wider(names_from = c(dose, int), values_from = c(value, temp)) %>%
  select(-ncol(.))

#  study_id value_dose_1_int1 value_dose_2_int2 value_dose_3_int3 temp_dose_1_int1 temp_dose_2_int2
#     <dbl> <date>            <date>            <date>                       <dbl>            <dbl>
#1     1001 2010-01-01        2010-01-10        NA                          0.290            NA    
#2     1002 2012-02-03        2012-02-04        2012-03-01                  0.0345            0.897
#3     1003 2013-01-01        2013-01-02        2013-02-02                  0.0323            1