多行的时间间隔
Time interval over multiple rows
我正在尝试解决一个使用时间间隔的问题,一段时间以来我一直很头疼。
这是两个 ID 的药物处方示例。
df <- data.frame('ID' = c('1','1','1','1','2','2'), 'start' = c('2010-01-01', '2010-01-03', '2010-01-05', '2010-01-09','2010-02-01', '2010-02-10'),
'end' = c('2010-01-03', '2010-01-22', '2010-01-07', '2010-01-12', '2010-02-10', '2010-02-12'))
ID start end
1 1 2010-01-01 2010-01-03
2 1 2010-01-03 2010-01-22
3 1 2010-01-05 2010-01-07
4 1 2010-01-09 2010-01-12
5 2 2010-02-01 2010-02-10
6 2 2010-02-10 2010-02-12
目的是创建一个新列来指示持续吸毒。因此,在此示例中,两个 ID 都可以连续使用(处方结束与下一次处方开始之间的最大间隔 = 1 天)。最终结果应该是这样的(逻辑上表示连续使用):
ID start end continuous
1 1 2010-01-01 2010-01-03 FALSE
2 1 2010-01-03 2010-01-22 TRUE
3 1 2010-01-05 2010-01-07 TRUE
4 1 2010-01-09 2010-01-12 TRUE
5 2 2010-02-01 2010-02-10 FALSE
6 2 2010-02-10 2010-02-12 TRUE
我试图用 dplyr 和 lubridate 解决这个问题,但没有设法得到第 4 行的正确结果,因为它不是连续的第 3 行而是第 2 行。这是我的代码:
df$start <- ymd(df$start)
df$end <- ymd(df$end)
df <- df %>% group_by(ID) %>% mutate(continuous = if_else(lag(end) - start >= -1, TRUE, FALSE, missing = FALSE))
非常感谢您对此提供的帮助!谢谢!
按 ID 将数据框分成几组,然后检查每一行的起点是否位于另一行的起点和终点之间。 (它总是位于自身的开始和结束之间,因此,return TRUE
if sum(..)>1
)
数据:
df <- data.frame('ID' = c('1','1','1','1','2','2'), 'start' = c('2010-01-01', '2010-01-03', '2010-01-05', '2010-01-09','2010-02-01', '2010-02-10'),
'end' = c('2010-01-03', '2010-01-22', '2010-01-07', '2010-01-12', '2010-02-10', '2010-02-12'),stringsAsFactors = F)
df$start = as.Date(df$start)
df$end = as.Date(df$end)
代码:
df$continuous = unlist(lapply(split(df,df$ID), function(x) {lapply(1:nrow(x),
function(y) { sum(x$start[y]>=x$start & x$start[y] <= x$end + 1) })>1 }))
输出:
ID start end continuous
1 1 2010-01-01 2010-01-03 FALSE
2 1 2010-01-03 2010-01-22 TRUE
3 1 2010-01-05 2010-01-07 TRUE
4 1 2010-01-09 2010-01-12 TRUE
5 2 2010-02-01 2010-02-10 FALSE
6 2 2010-02-10 2010-02-12 TRUE
希望对您有所帮助!
我正在尝试解决一个使用时间间隔的问题,一段时间以来我一直很头疼。
这是两个 ID 的药物处方示例。
df <- data.frame('ID' = c('1','1','1','1','2','2'), 'start' = c('2010-01-01', '2010-01-03', '2010-01-05', '2010-01-09','2010-02-01', '2010-02-10'),
'end' = c('2010-01-03', '2010-01-22', '2010-01-07', '2010-01-12', '2010-02-10', '2010-02-12'))
ID start end
1 1 2010-01-01 2010-01-03
2 1 2010-01-03 2010-01-22
3 1 2010-01-05 2010-01-07
4 1 2010-01-09 2010-01-12
5 2 2010-02-01 2010-02-10
6 2 2010-02-10 2010-02-12
目的是创建一个新列来指示持续吸毒。因此,在此示例中,两个 ID 都可以连续使用(处方结束与下一次处方开始之间的最大间隔 = 1 天)。最终结果应该是这样的(逻辑上表示连续使用):
ID start end continuous
1 1 2010-01-01 2010-01-03 FALSE
2 1 2010-01-03 2010-01-22 TRUE
3 1 2010-01-05 2010-01-07 TRUE
4 1 2010-01-09 2010-01-12 TRUE
5 2 2010-02-01 2010-02-10 FALSE
6 2 2010-02-10 2010-02-12 TRUE
我试图用 dplyr 和 lubridate 解决这个问题,但没有设法得到第 4 行的正确结果,因为它不是连续的第 3 行而是第 2 行。这是我的代码:
df$start <- ymd(df$start)
df$end <- ymd(df$end)
df <- df %>% group_by(ID) %>% mutate(continuous = if_else(lag(end) - start >= -1, TRUE, FALSE, missing = FALSE))
非常感谢您对此提供的帮助!谢谢!
按 ID 将数据框分成几组,然后检查每一行的起点是否位于另一行的起点和终点之间。 (它总是位于自身的开始和结束之间,因此,return TRUE
if sum(..)>1
)
数据:
df <- data.frame('ID' = c('1','1','1','1','2','2'), 'start' = c('2010-01-01', '2010-01-03', '2010-01-05', '2010-01-09','2010-02-01', '2010-02-10'),
'end' = c('2010-01-03', '2010-01-22', '2010-01-07', '2010-01-12', '2010-02-10', '2010-02-12'),stringsAsFactors = F)
df$start = as.Date(df$start)
df$end = as.Date(df$end)
代码:
df$continuous = unlist(lapply(split(df,df$ID), function(x) {lapply(1:nrow(x),
function(y) { sum(x$start[y]>=x$start & x$start[y] <= x$end + 1) })>1 }))
输出:
ID start end continuous
1 1 2010-01-01 2010-01-03 FALSE
2 1 2010-01-03 2010-01-22 TRUE
3 1 2010-01-05 2010-01-07 TRUE
4 1 2010-01-09 2010-01-12 TRUE
5 2 2010-02-01 2010-02-10 FALSE
6 2 2010-02-10 2010-02-12 TRUE
希望对您有所帮助!