Слияние с операторами if() в R

#r #if-statement #merge #vlookup

#r #if-оператор #слияние #vlookup

Вопрос:

Я пытаюсь выполнить поиск по двум наборам данных с помощью STUDY_ID. Набор данных имеет 450 000 строк с уникальными идентификаторами ИССЛЕДОВАНИЯ. Каждый STUDY_ID в dataset one имеет INDEX_DATE . Второй набор данных содержит 2 000 000 строк с одинаковыми идентификаторами ИССЛЕДОВАНИЯ, но с дубликатами и разными временами приема. Второй набор данных имеет другую переменную CARE_SETTING (кодируется как «I» /»O» /»E» /»U»).

Мне нужно найти STUDY_IDs, для которых INDEX_DATE== ADMIT_TIME, а затем, среди них, те, у которых несколько записей INDEX_DATE== ADMIT_TIME, если CARE_SETTING для всех записей одинаковы (все «I», все «O» и т. Д.), Затем покажите одну запись «I», «O»И т. Д. Для CARE_SETTING; если какая-либо смесь «O», «I», «E», «U», затем покажите «I» для CARE_SETTING, если любая другая комбинация, исключая «I», показывает «O» для CARE_SETTING.

Набор данных 1 (df1)

STUDY_ID INDEX_DATE
1234 8-20 октября
1235 13 июля-20
1236 5 июня-19
1237 18-20 августа
1238 13-20 января
1239 12-20 сентября

Набор данных 2 (df2) (для удобства чтения набран * для дат, равных INDEX_DATE)

STUDY_ID ADMIT_TIME CARE_SETTING
1234 8-20 октября* E
1234 8-20 октября* O
1236 25 февраля-19 Я
1236 28-20 августа Я
1238 13-20 января* Я
1238 13-20 января* O
1239 2 февраля-20 E
1239 12-20 сентября* O
1235 13 июля-20* E
1235 13 июля-20* E
1237 22-20 марта O
1237 12-20 апреля Я

Требуемый набор данных

STUDY_ID INDEX_DATE=ADMIT_TIME CARE_SETTING
1234 8-20 октября O
1235 13 июля-20 E
1238 13-20 января Я
1239 12-20 сентября O

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

1. Как 1234 получает букву «О»? Он имеет два значения «E» и «O».

2. Любая комбинация O, E, U получает «O». Любая комбинация, включающая «Я», получает «Я».

3. В своем сообщении вы упомянули any mixture of "O", "I", "E", "U", then show "I" for CARE_SETTING

Ответ №1:

Объединить два набора данных с помощью 'STUDY_ID' и для каждого STUDY_ID определить CARE_SETTING значение, используя case_when :

 library(dplyr)

df1 %>%
  inner_join(df2, by = c('STUDY_ID', 'INDEX_DATE' = 'ADMIT_TIME')) %>%
  group_by(STUDY_ID) %>%
  summarise(CARE_SETTING = case_when(n_distinct(CARE_SETTING) == 1 ~ first(CARE_SETTING), 
                                     any(CARE_SETTING %in% "O") ~ "O", 
                                     any(CARE_SETTING %in% "I") ~ "I")) -> result
 

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

1. Во-первых, мне нужно позаботиться об INDEX_DATE=ADMIT_TIME, ваш подход не решает эту проблему

2. Вы хотите проверять CARE_SETTING только STUDY_ID INDEX_DATE=ADMIT_TIME совпадения where и ? Я соответствующим образом обновил ответ, чтобы присоединиться. Я не совсем понимаю условия получения значений «I» или «O» CARE_SETTING , поскольку у вас разная логика в вашем сообщении, разные комментарии и ожидаемый результат разные.

3. Спасибо! Теперь он должен работать с небольшими изменениями.

4. Ответ не помог.