Заменить части строки в R - PullRequest
       14

Заменить части строки в R

1 голос
/ 15 апреля 2020

Я хотел бы иметь возможность заменить на входе ниже keywordN на tiab LIKE '%keywordN%', чтобы иметь возможность преобразовать ввод ключевого слова в строку SQL в R. Ключевые слова - это слова или комбинации слов, например: ((ELISA) OR (antibody test) AND (blood))

input = "((keyword1) OR (keyword2) AND (keyword3))"

до:

output = "((tiab LIKE '%keyword1%') OR (tiab LIKE '%keyword2%') AND (tiab like '%keyword3%'))"

для использования следующим образом:

sqlDF = sqldf(paste("select * from df1 where ",output))

Есть предложения? Очень ценится!

Ответы [ 3 ]

3 голосов
/ 15 апреля 2020

Для этой цели пакет sqldf загружает пакет gsubfn, поэтому никаких дополнительных пакетов не требуется. Кроме того, paste, используемый в показанном в вопросе выражении sqldf, не требуется, поскольку gsubfn предоставляет для этой цели fn$, как показано ниже.

gsubfn соответствует регулярному выражению, передает группу захвата (s) ) ко второму аргументу (который является функцией, которая необязательно выражается в формуле, как мы это делаем здесь) и заменяет совпадение выходными данными функции. Мы предположили, что ключевые слова состоят из букв, цифр и пробелов, поэтому мы использовали класс символов [A-Za-z0-9] для определения допустимых символов в ключевом слове, но если они могут содержать другие символы, добавьте их в.

Ниже мы получаем ошибку только потому, что вопрос не определил образец DF, но он по-прежнему показывает расширенный оператор SQL, переданный бэкэнду, поэтому мы можем видеть, что он работал.

library(sqldf)  # sqldf also load gsubfn
input <- "((ELISA) OR (antibody test) AND (blood))"

output <- gsubfn("\\(([A-Za-z0-9 ]+)\\)", ~ sprintf("(tiab LIKE '%%%s%%')", x), input) 

fn$sqldf("select * from DF where $output", verbose = TRUE)

подача:

sqldf: library(RSQLite)
sqldf: m <- dbDriver("SQLite")
sqldf: connection <- dbConnect(m, dbname = ":memory:")
sqldf: initExtension(connection)
sqldf: dbGetQuery(connection, 'select * from DF where ((tiab LIKE '%ELISA%') OR (tiab LIKE '%antibody test%') AND (tiab LIKE '%blood%'))')
Error: no such table: DF
sqldf: dbDisconnect(connection)
2 голосов
/ 15 апреля 2020

Как насчет этого?

s <- "((ELISA) OR (antibody test) AND (blood))"
gsub("(?<=\\()([^()]*)(?=\\))", "tiab LIKE '%\\1%'", s, perl=T)
# [1] "((tiab LIKE '%ELISA%') OR (tiab LIKE '%antibody test%') AND (tiab LIKE '%blood%'))"
2 голосов
/ 15 апреля 2020

Использование stringr:

stringr::str_replace_all(input, "keyword(\\d)", "tiab LIKE '%keyword\\1%'")

# "((tiab LIKE '%keyword1%') OR (tiab LIKE '%keyword2%') AND (tiab LIKE '%keyword3%'))"

Для другого вашего примера:

input <- "((ELISA) OR (antibody test) AND (blood))"

str_replace_all(input, "\\(([^\\(\\)]+)\\)", "(tiab LIKE '%\\1%')")

# "((tiab LIKE '%ELISA%') OR (tiab LIKE '%antibody test%') AND (tiab LIKE '%blood%'))"
...