2017-08-08 109 views
1

我试图解决一段时间以来我给我头疼的问题。多行的时间间隔

这是两个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)) 

我真的很感激一些帮助这个!谢谢!

回答

0

按ID分组数据帧,然后检查每行是否开始位于另一行的开始和结束之间。 (它总是处于启动和自身端之间,因此,因此,返回TRUE如果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 

希望这有助于!

+0

我感到困惑并删除了我的答案。尝试在这个数据帧上运行你的解决方案,'df1 < - rbind(data.frame(ID = 1,start = as.POSIXct(c('2010-02-03','2010-02-05'),format = '%Y-%m-%d'),end = as.POSIXct(c('2010-02-04','2010-02-06'),format ='%Y-%m-%d') ,stringsAsFactors = F),df [df $ ID == 2,])',是预期的结果吗? – Sotos

+0

太棒了!非常感谢弗洛里安! – ceefel

+0

@Sotos,你是对的,谢谢你的提升。我忘了包括1天的差距,我会更新我的答案。 – Florian