Назначьте максимальное и минимальное значения из столбца, если выполняется условие

#r

Вопрос:

У меня есть фрейм данных , подобный этому, но без последних двух столбцов (Вход, выход). Я хочу создать столбец «Вход» и назначить минимальное значение из столбца «вход», если значение в столбце «вход» равно 1. Аналогично, создайте столбец «Выход», и если значение в столбце «Вход» равно 1, назначьте ему максимальное значение из столбца «Выход». Окончательные данные с требуемым столбцом «Вход» и «Выход» должны выглядеть следующим образом

 structure(list(id = c(1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2), admission = c("2002/02/13",  "2002/03/05", "2002/04/04", "2002/04/05", "2002/05/30", "2002/07/20",  "2003/02/11", "2003/02/17", "2007/02/20", "2007/07/03", "2007/07/23",  "2007/08/03"), discharged = c("2002/02/26", "2002/04/04", "2002/04/05",  "2002/05/30", "2002/07/02", "2002/07/23", "2003/03/14", "2003/03/19",  "2007/02/28", "2007/07/23", "2007/08/02", "2007/08/05"), hosp = c(0,  1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0), In = c("2002/02/13", "2002/03/05",  "2002/03/05", "2002/03/05", "2002/05/30", "2002/07/20", "2003/02/11",  "2003/02/17", "2007/02/20", "2007/07/03", "2007/07/03", "2007/08/03" ), Out = c("2002/02/26", "2002/05/30", "2002/05/30", "2002/05/30",  "2002/07/02", "2002/07/23", "2003/03/14", "2003/03/19", "2007/02/28",  "2007/08/02", "2007/08/02", "2007/08/05")), class = "data.frame", row.names = c(NA,  -12L))  

Я попытался использовать функцию min (), но она присваивает минимальное значение, когда столбец hosp также имеет 0.

Ответ №1:

Преобразуйте столбцы даты в Date класс, а затем выполните replace исправление с помощью min/max

 library(dplyr) library(lubridate) df1 %gt;%  mutate(admission = ymd(admission), discharged = ymd(discharged)) %gt;%   group_by(id) %gt;%  mutate(In2 = replace(admission, as.logical(hosp),  min(admission[as.logical(hosp)])),  Out2 = replace(discharged, as.logical(hosp),   max(discharged[as.logical(hosp)]))) %gt;%  ungroup  

-выход

 # A tibble: 12 × 8  id admission discharged hosp In Out In2 Out2   lt;dblgt; lt;dategt; lt;dategt; lt;dblgt; lt;chrgt; lt;chrgt; lt;dategt; lt;dategt;   1 1 2002-02-13 2002-02-26 0 2002/02/13 2002/02/26 2002-02-13 2002-02-26  2 1 2002-03-05 2002-04-04 1 2002/03/05 2002/05/30 2002-03-05 2002-05-30  3 1 2002-04-04 2002-04-05 1 2002/03/05 2002/05/30 2002-03-05 2002-05-30  4 1 2002-04-05 2002-05-30 1 2002/03/05 2002/05/30 2002-03-05 2002-05-30  5 1 2002-05-30 2002-07-02 0 2002/05/30 2002/07/02 2002-05-30 2002-07-02  6 1 2002-07-20 2002-07-23 0 2002/07/20 2002/07/23 2002-07-20 2002-07-23  7 1 2003-02-11 2003-03-14 0 2003/02/11 2003/03/14 2003-02-11 2003-03-14  8 1 2003-02-17 2003-03-19 0 2003/02/17 2003/03/19 2003-02-17 2003-03-19  9 2 2007-02-20 2007-02-28 0 2007/02/20 2007/02/28 2007-02-20 2007-02-28 10 2 2007-07-03 2007-07-23 1 2007/07/03 2007/08/02 2007-07-03 2007-08-02 11 2 2007-07-23 2007-08-02 1 2007/07/03 2007/08/02 2007-07-03 2007-08-02 12 2 2007-08-03 2007-08-05 0 2007/08/03 2007/08/05 2007-08-03 2007-08-05  

Комментарии:

1. И можем ли мы тогда просто избавиться от этих вновь созданных дублированных столбцов, но имея в виду, что для других идентификаторов может быть одна и та же дата. Итак, я думаю сгруппироваться по идентификатору, а затем только для этих идентификаторов получить уникальные даты в In2.

2. @kamrankhan здесь единственная причина, по которой я создал дубликаты столбцов, — это показать сравнение ваших ожидаемых с новыми столбцами

3. @kamrankhan это уже сгруппировано по «id», если вы проверите мой код group_by(id)

4. Как бы вы получили уникальные значения в этом случае?

5. @kamrankhan Я не понял твоего вопроса. Разве этот вопрос не касается изменения на min/max для тех hosp, которые равны 1