2016-10-15 7 views
0

Мне хотелось бы иметь возможность сравнивать строки в ядре данных.Сравнение строк в группе в R

Идея состоит в том, что я должен сравнивать строки, где идентификационный номер тот же, а столбец 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

Это исключено, потому что строки для сравнения должны быть не более трех дней друг от друга для одного и того же идентификатора –

ответ

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 

Идея создать столбец с разницей между 2 датами, используя lag() и фильтр на этой колонке, а также дату и число дат на один идентификатор.

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)] 
Смежные вопросы