#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