替换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)
我希望能够将 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)