#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. Ответ не помог.