2016-10-15 35 views
0

我希望能够比较我拥有的数据框中的行。比较R组中的行

这个想法是,我应该比较ID号相同的行和VisitDate列最多不超过三天。我想用更晚的日期而不是更早的日期。

我的数据帧:

id  Date 

1  12/05/06 
1  16/05/06 
1  17/05/06 
4  12/05/06 
4  13/05/06 
3  12/05/06 
5  12/05/06 
66  12/05/06 
66  13/05/06 
66  19/05/06 
66  24/05/06 
66  25/05/06 

数据帧我想是

1  17/05/06 
4  13/05/06 
66  13/05/06 
66  25/05/06 

到目前为止的代码是:

library(dplyr) 
    arrange(id, as.Date(data$Date, '%d/%m/%y')) %>% 
      #Search where two rows have the same hospital number 
     group_by(id) %>% 
     slice(which.max(Date)) 

但这并不返回正确的数据。

+0

不要以为我明白了。为什么从输出中排除'66 - 19/05/06'行? – nicola

+0

这是排除的,因为要比较的行应该不超过三天相同的ID –

回答

0

这似乎适用于案例样本,也许它会适用于您的数据。 数据用于:

data=data.frame(id=c(1,1,1,4,4,3,5,66,66,66,66,66), 
       Date=as.Date(c(1,5,6,1,2,1,1,1,2,8,13,14),origin = "2006-05-11")) 

使用dplyr

library(dplyr) 
data%>% 
    group_by(id)%>% 
    mutate(Diff=Date-lag(Date),n=n())%>% 
    filter((Date==max(Date) | Diff<3)&n>1)%>% 
    select(id,Date) 
    id  Date 
    <dbl>  <date> 
1  1 2006-05-17 
2  4 2006-05-13 
3 66 2006-05-13 
4 66 2006-05-25 

的想法是创建具有在该列使用lag()和过滤器2名的日期以及日期和日期的数量之间的差的柱每个ID。

0
library(data.table) 
library(lubridate) 

data = read.table(header = T, text = " 
    id  Date 
1  12/05/06 
1  16/05/06 
1  17/05/06 
4  12/05/06 
4  13/05/06 
3  12/05/06 
5  12/05/06 
66  12/05/06 
66  13/05/06 
66  19/05/06 
66  24/05/06 
66  25/05/06 
      ") 

setDT(data)[, Date := dmy(Date)] 

data[, Diff := { 
    lagged = shift(Date, n = 1, type = "lag") 
    delta = Date - lagged 
}, by = id][Diff <= 3 & Diff > 0, .(id, Date)]