替换R中的部分字符串

Replace parts of a string in R

我希望能够将 keywordN 下面的输入替换为 tiab LIKE '%keywordN%',以便能够将关键字输入转换为 R 中的 SQL 字符串。关键字是单词或单词组合,例如:((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))

有什么建议吗?非常感谢!

使用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%'))"

这个怎么样?

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%'))"

sqldf 包为此加载了 gsubfn 包,因此不需要额外的包。此外,问题中显示的 sqldf 语句中使用的 paste 也不需要,因为 gsubfn 为此目的提供了 fn$,如下所示。

gsubfn 匹配正则表达式,将捕获组传递给第二个参数(这是一个可选地用公式表示法表示的函数,就像我们在这里所做的那样)并用函数的输出替换匹配项。我们假设关键字由字母、数字和空格组成,因此我们使用字符 class [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)