2016-10-15 36 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)]