Заменить правила (сопоставление с образцом строки) в R - PullRequest
0 голосов
/ 18 октября 2019

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

Заявленные условия

"2 Left Axillary Lymph Nodes Resection"             
"cardyoohyper"                                      
"Ablation Breast"                                    
"Hypercarido"                                       
"chordiohyper"                                       
"Adenocarcinoma Of Colon (Radical Resection And Cr)"
"myocasta"
"hypermyopa"

У меня есть еще один фрейм данных со следующими правилами:

Фрейм данных

enter image description here

Я ожидаю вывод ниже:

"2 Left Axillary Lymph Nodes Resection"             
"carddiohiper"                                      
"Ablation Breast"                                    
"hipercardio"                                       
"cardiohyper"                                       
"Adenocarcinoma Of Colon (Radical Resection And Cr)"
"miocasta"
"hipermiopa"

Я пытаюсь с горячим кодированием с функцией gsub, но я понимаю, что это займетмного времени.

pattern <- c("kardio, "carido", "cardyo", "cordio", "chordio")
replacement <- "cardio"
gusub(pattern,replacement,df$reportedterms)

с вышеупомянутым подходом мне нужно каждый раз кодировать для каждого правила, и мне нужно каждый раз создавать разные переменные для шаблона и замены в функции gsub.

IsЕсть простой подход для решения этой проблемы?

1 Ответ

0 голосов
/ 18 октября 2019

Сначала давайте настроим это так, как вы описали:

library(tibble)

df <- tibble(text = c("2 Left Axillary Lymph Nodes Resection",
                      "cardyoohyper",
                      "Ablation Breast",
                      "Hypercarido",
                      "chordiohyper",
                      "Adenocarcinoma Of Colon (Radical Resection And Cr)",
                      "myocasta",
                      "hypermyopa"))

replace_dict <- tibble(pattern = list(c("kardio", "carido", "cardyo", "cordio", "chordio"), 
                                      "myoca",
                                      "myopa",
                                      "hyper"),
                       replacement = c("cardio", 
                                       "mioca",
                                       "miopa",
                                       "hiper"))

Я бы просто использовал stringi для задачи, так как она имеет чрезвычайно эффективную версию gsub, которая stri_replace_all_fixed (примечаниечто вы также можете использовать версию регулярного выражения, которая немного медленнее, но работает так же). Он может обрабатывать несколько шаблонов и замен одновременно, поэтому все, что нам нужно сделать, это сначала развернуть столбец шаблона, а затем выполнить stringi:

batch_replace <- function(text, replace_dict) {

  replace_dict <- tidyr::unnest(replace_dict, pattern) 

  stringi::stri_replace_all_fixed(str = text, 
                                  pattern = replace_dict$pattern, 
                                  replacement = replace_dict$replacement, 
                                  vectorize_all = FALSE)
}

Давайте проверим эту функцию:

df$text_new <- batch_replace(df$text, replace_dict)
df
#> # A tibble: 8 x 2
#>   text                                 text_new                            
#>   <chr>                                <chr>                               
#> 1 2 Left Axillary Lymph Nodes Resecti~ 2 Left Axillary Lymph Nodes Resecti~
#> 2 cardyoohyper                         cardioohiper                        
#> 3 Ablation Breast                      Ablation Breast                     
#> 4 Hypercarido                          Hypercardio                         
#> 5 chordiohyper                         cardiohiper                         
#> 6 Adenocarcinoma Of Colon (Radical Re~ Adenocarcinoma Of Colon (Radical Re~
#> 7 myocasta                             miocasta                            
#> 8 hypermyopa                           hipermiopa

Я думаю, это то, что вы хотели. Обратите внимание, что функция не очень гибкая, так как вы должны предоставить stri_replace_all_fixed точно так, как показано. Поскольку вы не предоставили доступ к файлу, я не могу помочь вам с заполнением этой формы, поэтому вам нужно выяснить это или задать новый вопрос.

...