2016-10-15 11 views
0

私はデータフレームの行を比較できるようにしたいと考えています。グループの行を比較するR

アイデアの番号が同じで、VisitDate列が最大3日間異なる行を比較する必要があるという考えがあります。私は前の行ではなく、後の行で行を取りたい。

マイデータフレーム:私はしたい

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に対して3日以上離れてはならないためです –

答えて

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")) 

を考え、この列に2つのlag()を使用して日付とフィルタとの間の差を用いてカラムならびに日付および日付の数を作成することである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 

を使用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)] 
関連する問題