Словарь регулярных выражений - PullRequest
0 голосов
/ 11 февраля 2019

У меня есть следующая функция:

HistolMacDescrip <- function(dataframe, MacroColumn) {
  dataframe <- data.frame(dataframe)

  # Column specific cleanup
  dataframe[, MacroColumn] <- str_replace(dataframe[, MacroColumn],
                                          "[Dd]ictated by.*", "")
  # Conversion of text numbers to allow number of biopsies to be extracted
  dataframe[, MacroColumn] <- str_replace(dataframe[, MacroColumn],
                                          "[Oo]ne", "1")
  dataframe[, MacroColumn] <- str_replace(dataframe[, MacroColumn],
                                          "[Ss]ingle", "1")
  dataframe[, MacroColumn] <- str_replace(dataframe[, MacroColumn],
                                          "[Tt]wo", "2")
  dataframe[, MacroColumn] <- str_replace(dataframe[, MacroColumn],
                                          "[Tt]hree", "3")
  dataframe[, MacroColumn] <- str_replace(dataframe[, MacroColumn],
                                          "[Ff]our", "4")
  dataframe[, MacroColumn] <- str_replace(dataframe[, MacroColumn],
                                          "[Ff]ive", "5")
  dataframe[, MacroColumn] <- str_replace(dataframe[, MacroColumn],
                                          "[Ss]ix", "6")
  dataframe[, MacroColumn] <- str_replace(dataframe[, MacroColumn],
                                          "[Ss]even", "7")
  dataframe[, MacroColumn] <- str_replace(dataframe[, MacroColumn],
                                          "[Ee]ight", "8")
  return(dataframe)
}

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

key                                  value
bus|car|.*toy                     vehicle
\\d+\\s+mg                            dose

Есть ли функция, которая может выполнять такую ​​функцию поиска по словарю, так что все, что мне нужно сделать, это определить словарь, например, в csv или что-то в этом роде?

1 Ответ

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

Вот возможный подход

# Function
my_transform <- function (string, lookup) {
  new_string <- string
  vapply(1:nrow(lookup),
         function (k) {
           new_string <<- gsub(lookup$key[k], lookup$value[k], new_string)
           0L
         }, integer(1))
  new_string
}

# Results
# lookup table
lookup <- structure(list(key = c("bus|car|.*toy", "\\d+\\s+mg"), 
                         value = c("vehicle","dose")), 
                    row.names = 1:2, class = "data.frame")

# string 1
string1 <- c('This car', '256 mg', '6536 \n mg')
my_transform(string1, lookup)
# [1] "This vehicle" "dose"         "dose" 

# # string 2
string2 <- c('This car is no toy', '256 mg', '6536 \n mg')
my_transform(string2, lookup)
# [1] "vehicle" "dose"    "dose"

# data frame
df <- data.frame(string1, string2, stringsAsFactors = FALSE)
matrix(my_transform(unlist(df), lookup), nrow(df), ncol(df))  
#      [,1]           [,2]     
# [1,] "This vehicle" "vehicle"
# [2,] "dose"         "dose"   
# [3,] "dose"         "dose"  
# or
vapply(1:ncol(df), 
       function (k) my_transform(.subset2(df, k), lookup),
       character(nrow(df)))
#      [,1]           [,2]     
# [1,] "This vehicle" "vehicle"
# [2,] "dose"         "dose"   
# [3,] "dose"         "dose" 

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

Обратите внимание, что могут возникнуть проблемы, см. string2[1]: здесь необходимо убедиться, что именно является желаемым выходом для такого экземпляра.

Наконец, два последних пункта:

  • gsub имеет другие полезные аргументы, такие как perl (TRUE or FALSE) и fixed (TRUE or FALSE).Они могут быть включены в таблицу lookup, например, добавив столбцы с пометкой perl, fixed, etc..Это дает вам больше контроля.
  • там много полезных regex функций (ср. ?sub): в зависимости от ваших потребностей, вы можете использовать или комбинировать другие функции.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...