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
晚上好。我正在寻找一个更简单的解决方案来解决我对数据集的模糊任务。我已经使用 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