Что я использую вместо вложенного ifelse, если у меня более 50 значений в r? - PullRequest
0 голосов
/ 07 мая 2018

У меня есть следующий код, и я обычно использую ifelse для создания столбца с моими переименованными значениями в моем data.frame, но на этот раз мое число вложенных значений> 50, так что у кого-нибудь есть идеи о том, что еще я могу использовать для создания новый столбец на основе значений в другом? Я пытался разделить их на 3 новых столбца, а затем объединить эти новые столбцы, но получал ошибки.

df$ARV <- transform(df$ADAV1 == "055", "Isoprinosine",
             ifelse(df$ADAV1 == "056", "HPA-23",
                    ifelse(df$ADAV1 == "057", "Suramin",
                           ifelse(df$ADAV1 == "058", "Ribavirin",
                                  ifelse(df$ADAV1 == "090", "Alpha Interferon",
                                         ifelse(df$ADAV1 == "091", "Foscarnet/PFA",
                                                ifelse(df$ADAV1 == "092", "AZT",
                                                       ifelse(df$ADAV1 == "094", "ddC",
                                                              ifelse(df$ADAV1 == "098", "AL-721",
                                                                     ifelse(df$ADAV1 == "101", "Ampligen",
      ifelse(df$ADAV1 == "108", "Peptide T",
       ifelse(df$ADAV1 == "110", "Dextran-Sulfate",
         ifelse(df$ADAV1 == "122", "Beta Interferon",
           ifelse(df$ADAV1 == "128", "CD4",
             ifelse(df$ADAV1 == "147", "ddI",
               ifelse(df$ADAV1 == "159", "d4T",
                 ifelse(df$ADAV1 == "163", "ddA",
                   ifelse(df$ADAV1 == "179", "adenosine arabinoside",
                     ifelse(df$ADAV1 == "180", "AZT/ddI Blinded Trial",
                      ifelse(df$ADAV1 == "185", "AZT/ddC Blinded Trial",
                       ifelse(df$ADAV1 == "186", "ddI/ddC Blinded Trial",
                        ifelse(df$ADAV1 == "187", "AZT/ddI/ddC Blinded Trial",
                         ifelse(df$ADAV1 == "191", "Nevirapine",
                           ifelse(df$ADAV1 == "192", "TAT inhibitors",
                             ifelse(df$ADAV1 == "193", "PI-O",
                               ifelse(df$ADAV1 == "194", "U-90/152/Delavirdine",
                                 ifelse(df$ADAV1 == "201", "AZT/d4T Trial",
                                   ifelse(df$ADAV1 == "204", "3TC",
                                     ifelse(df$ADAV1 == "205", "AZT/3-TC Blinded Trial",
                        ifelse(df$ADAV1 == "206", "AZT/ddI/PI Blinded Trial",
                               NA )))))))))))))))))))))))))))))))
df$ARV2  <- ifelse(df$ADAV1 == "208", "AZT/PI Blinded Trial",
         ifelse(df$ADAV1 == "209", "d4T/PI Blinded Trial",
           ifelse(df$ADAV1 == "210", "Saquinavir",
             ifelse(df$ADAV1 == "211", "Ritonavir",
                ifelse(df$ADAV1 == "212", "Indinavir",
                  ifelse(df$ADAV1 == "214", "AZT/3-TC/PI Blinded Trial",
                    ifelse(df$ADAV1 == "216", "Nelfinavir",
                       ifelse(df$ADAV1 == "217", "ABT-378",
                         ifelse(df$ADAV1 == "218", "Abacavir",
                  ifelse(df$ADAV1 == "219", "141W94",
                             ifelse(df$ADAV1 == "220", "Enfavirenz",
                                     ifelse(df$ADAV1 == "221", "MKC442",
                                       ifelse(df$ADAV1 == "222", "Lobucavir",
                                         ifelse(df$ADAV1 == "223", "Loviride",
                                           ifelse(df$ADAV1 == "224", "Adefovir",
                                             ifelse(df$ADAV1 == "227", "Combivir",
                                               ifelse(df$ADAV1 == "231", "Vistide",
                                                 ifelse(df$ADAV1 == "233", "T-20",
                                                   ifelse(df$ADAV1 == "234", "PMPA",
                                                      ifelse(df$ADAV1 == "238", "Timpranavir",
                                                        ifelse(df$ADAV1 == "239", "Emtricitabine",
                                                          ifelse(df$ADAV1 == "998", "Other",
                                                             NA ))))))))))))))))))))))

1 Ответ

0 голосов
/ 07 мая 2018

Самый простой вариант - создать ключ / val data.frame, а затем выполнить left_join

library(dplyr)
keyval <- data.frame(ADAV1 = c("055", "056", ...),
             val = c("Isoprinosine","HPA-23", ...), stringsAsFactors = FALSE)

left_join(df, keyval) %>% 
            mutate(ARV = replace(ADAV1, is.na(ADAV1), val))  

Аналогично, если есть другой набор ключей / val для генерации 'ARV2', тогда создайте

keyval2 <- data.frame(ADAV1 = c("208", "209", ...),
             val = c( "AZT/PI Blinded Trial", "d4T/PI Blinded Trial", ...),
       stringsAsFactors = FALSE)

и сделать второе присоединение


Или поместите их в list, а затем используйте map

library(purrr)
list(keyval, keyval2) %>%
            map2_df(., c("ARV", "ARV2"), ~ left_join(df, .x) %>%
                    transmute(!! (.y) := replace(ADAV1, is.na(ADAV1), val))) %>%
    bind_cols(df, .) 
...