Создать дату из другого столбца на основе даты, используя ifelse и Mutate в R - PullRequest
1 голос
/ 26 марта 2019

У меня есть 2 входных столбца, такие как Visit_start_date, Visit_type и один выходной столбец - Visit_end_date

Мне нужно заполнить значения столбца Visit_end_date в соответствии с приведенным ниже условием

Если столбец visit_type имеет такие значения, как «Амбулаторный» или «Неотложный», тогда значение visit_end_date совпадает (равно) с значением date_start_date Если он не совпадает, то я могу просто выбрать случайное значение из другого столбца (Дата выписки)

Я уже пробовал это сделать и, к сожалению, получил значение типа «72842» в качестве значения в столбце visit_end_date. Он должен быть в формате даты.

Обратите внимание, что Дата допуска в кадре данных имеет формат "6/8/2169", а дата выписки - в формате 85466.75694

DF %>% 
mutate(visit_start_date = as.Date(.$Admit_Date,format = "%m/%d/%Y")) %>%  #dates in raw file are in the format as specified in the code
mutate(visit_end_date = ifelse((.$Enc_Type == 'Outpatient'|.$Enc_Type == 'Emergency'),visit_start_date, as.Date(.$Discharge_Date,origin ='1970-01-01')))} 

Я ожидаю, что в столбцах visit_start_date и visit_end_date выходные данные будут равны «2169-06-08». В настоящее время это значение "2169-06-08" в visit_start_date и 72842 в visit_end_date, как показано на скриншоте ниже.

enter image description here

Найдите вывод команды dput

структура (список (Admit_Date = c ("6/8/2169 9:40", "6/8/2169 9:41", «6/8/2169 9:42», «24.07.2169 8:51», «12.09.2169 10:30», «19.06.2237 12:15», «19.06.22, 12:15», «19.06.22, 12:15», «27.04.22, 14:07», «27.04.22, 14:07» ), Discharge_Date = c (85466.75694, 85466.75694, 85466.75694, 85466,75694, 85466,75694, 85466,75694, 85466,75694, 85466,75694, 85466.75694, 85466.75694), Discharge_Disposition = c (NA_character_, NA_character_, NA_character_, NA_character_, NA_character_, NA_character_, NA_character_, NA_character_, NA_character_, NA_character_), Enc_Type = c («Амбулаторно», «Амбулаторно», «Амбулаторно», «Амбулаторно», «Амбулаторный», «Амбулаторный», «Амбулаторный», «Амбулаторный», «Амбулаторный», «Амбулаторный»), Служба = c («OVS / Eye», «Med / DM», «Med / DM», "Med / Renal", "Med / DM", "Dental / Dental Surg", "Dental / Dental Surg", "Dental / Dental Surg", "OVS / Eye", "OVS / Eye")), row.names = c (NA, -10L), класс = c ("tbl_df", "tbl", "data.frame"))

1 Ответ

1 голос
/ 26 марта 2019

Вот как бы я переписал твой код. Обратите внимание, что вам не нужно использовать .$ внутри mutate, вы можете просто использовать имена столбцов. Кроме того, вы можете запустить несколько операторов внутри одного mutate.

С Date объектами класса ifelse может отбрасывать необходимые атрибуты. dplyr::if_else делает хорошую работу:

DF %>%
  #dates in raw file are in the format as specified in the code
  mutate(
    visit_start_date = as.Date(Admit_Date, format = "%m/%d/%Y"),
    Discharge_Date = as.Date(Discharge_Date, origin = '1970-01-01'),
    visit_end_date = if_else(
      Enc_Type %in% c('Outpatient', 'Emergency'),
      visit_start_date,
      Discharge_Date
    )
  )
# # A tibble: 10 x 7
#    Admit_Date    Discharge_Date Discharge_Disposit~ Enc_Type Service       visit_start_date visit_end_date
#    <chr>         <date>         <chr>               <chr>    <chr>         <date>           <date>
#  1 6/8/2169 9:40 2204-01-01     NA                  Outpati~ OVS / Eye     2169-06-08       2169-06-08
#  2 6/8/2169 9:41 2204-01-01     NA                  Outpati~ Med / DM      2169-06-08       2169-06-08
#  3 6/8/2169 9:42 2204-01-01     NA                  Outpati~ Med / DM      2169-06-08       2169-06-08
#  4 7/24/2169 8:~ 2204-01-01     NA                  Outpati~ Med / Renal   2169-07-24       2169-07-24
#  5 9/12/2169 10~ 2204-01-01     NA                  Outpati~ Med / DM      2169-09-12       2169-09-12
#  6 6/19/2237 12~ 2204-01-01     NA                  Outpati~ Dental / Den~ 2237-06-19       2237-06-19
#  7 6/19/2237 12~ 2204-01-01     NA                  Outpati~ Dental / Den~ 2237-06-19       2237-06-19
#  8 6/19/2237 12~ 2204-01-01     NA                  Outpati~ Dental / Den~ 2237-06-19       2237-06-19
#  9 4/27/2238 14~ 2204-01-01     NA                  Outpati~ OVS / Eye     2238-04-27       2238-04-27
# 10 4/27/2238 14~ 2204-01-01     NA                  Outpati~ OVS / Eye     2238-04-27       2238-04-27

Я не могу проверить это, потому что вы не предоставили пример ввода. Если это не помогает, отредактируйте ваш вопрос, включив в него некоторые примеры данных , которыми поделились dput, например, dput(droplevels(DF[1:10, ])). Затем я могу проверить эти данные и попытаться выяснить, что идет не так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...