R - левое соединение (слияние) с частью данных (то есть с отсутствующими метками)? - PullRequest
0 голосов
/ 06 февраля 2019

У меня есть большой набор данных пациентов с их медицинскими записями.

Почти у всех есть MainSpecialtyCode, но соответствующее MainSpecialtyDescription более редкое.

У меня есть специальный словарь для этого, но я хочу сохранить уже существующие описания, независимо от того, соответствуют ли они словарю. Я не перезаписываю существующие описания.

Возможно ли объединение влево только для тех, у кого отсутствуют метки?

Илимне нужно разделить данные и объединить обратно, как я сделал ниже.

Интересно, есть ли альтернатива для этого?

  library(dplyr)

  # Mock data
  set.seed(1)
  MyData <- data.frame(
   patientID = c(LETTERS[seq(from=1, to=10)]),
   MainSpecialtyCode = c(1,2,3,4,6,11,8,1,2,3),
   MainSpecialtyDescription = c(NA, NA, NA, NA, "Geriatric", "Nursing", 
   "Cardiology","Nephrology", NA, NA)
  )
  SpecialtyDictionary <- data.frame(
   MainSpecialtyCode = c(1,2,3,4,5,6,7,8,9,10),
   MainSpecialtyDescription = c("Cardiology", "Nephrology", "Respiratory", 
   "Cancer", "General", "Paediatric", "Urinary", "Diabetes", "Podiatry",  
   "Nursing")
  )

  # Subset data with missing descriptions
  MissingData <- MyData[is.na(MyData$MainSpecialtyDescription), ]

  # Merge descriptions onto this
  MergedData <- MissingData %>% 
    select(-MainSpecialtyDescription) %>% 
    left_join(SpecialtyDictionary, by="MainSpecialtyCode")

  # Append onto data without missing descriptions
  MyData2 <- rbind(MyData[!is.na(MyData$MainSpecialtyDescription), ], MergedData)

1 Ответ

0 голосов
/ 06 февраля 2019

Purrr может быть лучшим пакетом для этого, но один из способов сделать это с dplyr может быть:

MyData %>% 
    filter(is.na(MainSpecialtyDescription)) %>% # deal only with NAs
    select(-MainSpecialtyDescription) %>% # remove column to be overwritten
    left_join(SpecialtyDictionary, by = "MainSpecialtyCode") %>% # get the values from dictionary
    bind_rows(MyData %>%  
                  filter(!is.na(MainSpecialtyDescription))) # bind the result to the original input

Выход:

> MyData %>% 
+     filter(is.na(MainSpecialtyDescription)) %>% 
+     select(-MainSpecialtyDescription) %>% 
+     left_join(SpecialtyDictionary, by = "MainSpecialtyCode") %>% 
+     bind_rows(MyData %>%  filter(!is.na(MainSpecialtyDescription)))
   patientID MainSpecialtyCode MainSpecialtyDescription
1          A                 1               Cardiology
2          B                 2               Nephrology
3          C                 3              Respiratory
4          D                 4                   Cancer
5          I                 2               Nephrology
6          J                 3              Respiratory
7          E                 6                Geriatric
8          F                11                  Nursing
9          G                 8               Cardiology
10         H                 1               Nephrology

РЕДАКТИРОВАТЬ: Здесьявляется альтернативным решением, использующим purrr::map в соответствии с запросом OP:

MyData %>% 
    mutate(MainSpecialtyDescription = as.character(MainSpecialtyDescription)) %>% 
    mutate(MainSpecialtyDescription = 
           ifelse(is.na(MainSpecialtyDescription),
           purrr::map_chr(.x = .$MainSpecialtyCode, ~ as.character(SpecialtyDictionary$MainSpecialtyDescription[match(.x, SpecialtyDictionary$MainSpecialtyCode)])), 
           MainSpecialtyDescription))

Выход:

> MyData %>% 
+     mutate(MainSpecialtyDescription = as.character(MainSpecialtyDescription)) %>% 
+     mutate(MainSpecialtyDescription = 
+            ifelse(is.na(MainSpecialtyDescription),
+            purrr::map_chr(.x = .$MainSpecialtyCode, ~ as.character(SpecialtyDictionary$MainSpecialtyDescription[match(.x, SpecialtyDictionary$MainSpecialtyCode)])), 
+            MainSpecialtyDescription))
   patientID MainSpecialtyCode MainSpecialtyDescription
1          A                 1               Cardiology
2          B                 2               Nephrology
3          C                 3              Respiratory
4          D                 4                   Cancer
5          E                 6                Geriatric
6          F                11                  Nursing
7          G                 8               Cardiology
8          H                 1               Nephrology
9          I                 2               Nephrology
10         J                 3              Respiratory

Обратите внимание на преобразование коэффициентов в строки.Преимущество состоит в том, что вы можете указать условие только один раз.

Кредит должен идти в основном здесь: Как использовать purrr для сопоставления записей из таблицы поиска?

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