Получить разность дат между первой датой группы и последней датой предыдущей группы в R - PullRequest
0 голосов
/ 27 ноября 2018

У меня есть набор данных, который выглядит следующим образом:

x = data.frame(id = c("A","A","A","A","B","B","B","B"), group = c(1,1,2,2,3,3,4,4),
               date1 = c("25/03/2017",  "26/03/2017","03/04/2017","04/04/2017",
                         "04/05/2017","26/08/2017","28/08/2017","30/08/2017"),    
               date2 = c("26/03/2017","29/03/2017","04/04/2017","04/05/2017",
                         "18/05/2017","28/08/2017","29/08/2017","31/08/2017")
                )
> x
  id group      date1      date2
1  A     1 25/03/2017 26/03/2017
2  A     1 26/03/2017 29/03/2017
3  A     2 03/04/2017 04/04/2017
4  A     2 04/04/2017 04/05/2017
5  B     3 04/05/2017 18/05/2017
6  B     3 26/08/2017 28/08/2017
7  B     4 28/08/2017 29/08/2017
8  B     4 30/08/2017 31/08/2017

Я хотел бы, чтобы каждый человек получил разницу в днях с первой даты в дате1 во второй группе ипоследняя дата в date2 предыдущей группы.Так, например, человеку с id = A, я хочу получить разницу дней "03/04/2017" и "29/03/2017".То же самое для пациента Б. У меня есть несколько групп внутри каждого человека.Я хотел бы в итоге получить такой набор данных:

y = data.frame(id = c("A","A","B","B"), group = c(1,2,3,4),
               date1 = c("26/03/2017","03/04/2017","26/08/2017","28/08/2017"),    
               date2 = c("29/03/2017","04/04/2017","28/08/2017","29/08/2017"),
               datediff = c(NA,5,NA,0)
              ) 
> y
  id group      date1      date2 datediff
1  A     1 26/03/2017 29/03/2017       NA
2  A     2 03/04/2017 04/04/2017        5
3  B     3 26/08/2017 28/08/2017       NA
4  B     4 28/08/2017 29/08/2017        0

Я много раз для этого искал, нашел и отвечу за вычитание первого и последнего наблюдения в одной и той же группе, но ничего о последнем и первомразных групп.Любая помощь приветствуется.Спасибо.

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

Разобрать ваши строковые даты, используя lubridate::dmy.Затем вы можете использовать dplyr для вычисления разницы между date1 и отстающими значениями date2.В конце отфильтруйте те строки, которые представляют новые группы.

library(dplyr)
library(lubridate)
x = data.frame(id = c("A","A","A","A","B","B","B","B"), group = c(1,1,2,2,3,3,4,4),
               date1 = dmy(c("25/03/2017",  "26/03/2017","03/04/2017","04/04/2017",
                         "04/05/2017","26/08/2017","28/08/2017","30/08/2017")),    
               date2 = dmy(c("26/03/2017","29/03/2017","04/04/2017","04/05/2017",
                         "18/05/2017","28/08/2017","29/08/2017","31/08/2017"))
)



x %>%
  group_by(id) %>%
  filter(group != lag(group) | group != lead(group)) %>%
  mutate(diff = date1 - lag(date2)) %>%
  ungroup()



# A tibble: 4 x 5
  id    group date1      date2      diff     
  <fct> <dbl> <date>     <date>     <time>   
1 A         1 2017-03-26 2017-03-29 NA days  
2 A         2 2017-04-03 2017-04-04 " 5 days"
3 B         3 2017-08-26 2017-08-28 NA days  
4 B         4 2017-08-28 2017-08-29 " 0 days"

А если вы хотите получить числовой вывод, используйте mutate(diff = as.numeric(date1 - lag(date2))).Пока ваши данные отсортированы (x <- x[with(x, order(id, group)), ]), они должны нормально работать независимо от количества людей и групп.

0 голосов
/ 27 ноября 2018

Вот более общий подход, который должен работать с 3+ группами на id и / или 3+ строками на группу:

library(dplyr)
library(lubridate)

# update dates (if needed)
x = x %>% mutate_at(vars(matches("date")), dmy)

# get appropriate rows based on first group 
x1 = x %>%
  group_by(id) %>%
  filter(group == min(group)) %>%
  filter(date1 == max(date1)) %>%
  ungroup()

# get appropriate rows based on last group 
x2 = x %>%
  group_by(id) %>%
  filter(group == max(group)) %>%
  filter(date2 == min(date2)) %>%
  ungroup()

# combine datasets and calculate date difference
x1 %>%
  bind_rows(x2) %>%
  arrange(id, group) %>%
  group_by(id) %>%
  mutate(datediff = as.numeric(date1 - lag(date2))) %>%
  ungroup()

# # A tibble: 4 x 5
#   id    group date1      date2      datediff
#   <fct> <dbl> <date>     <date>        <dbl>
# 1 A         1 2017-03-26 2017-03-29       NA
# 2 A         2 2017-04-03 2017-04-04        5
# 3 B         3 2017-08-26 2017-08-28       NA
# 4 B         4 2017-08-28 2017-08-29        0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...