有什么方法可以用 grepl 要求两次匹配而不是一次匹配吗?
Any way to require two matches instead of just one for TRUE with grepl?
我正在尝试使用 grepl 检测术语,但出现了太多误报。我希望可能有一种方法可以要求列表中任何术语的两次成功匹配(我对我的一段数据进行了手动编码,并试图让自动化至少大致对应于此,但我有大约 5是我手动编码时正面次数的两倍)。我没有看到 grepl 接受任何需要多个匹配才能触发 TRUE 的参数。是否有任何方法需要两次匹配才能触发 TRUE 发现?或者还有其他我应该使用的功能吗?
GenericColumn <- cbind(grepl(Genericpattern, Statement$Statement.Text, ignore.case = TRUE))
编辑:
这是一个更具体的例子:
Examplepattern <- 'apple|orange'
ExampleColumn <- cbind(grepl(Examplepattern, Rexample$Statement.Text, ignore.case = TRUE))
和现在一样,所有这些都将通过 grepl 触发 true。我只希望有两个引用的项目触发 true。
示例数据:
Rexample <- structure(list(Statement.Text = structure(c(2L, 1L, 3L, 5L, 4L
), .Label = c("This apple is a test about an apple.", "This is a test about apples.",
"This orange is a test about apples.", "This orange is a test about oranges.",
"This orange is a test."), class = "factor")), .Names = "Statement.Text", row.names = c(NA,
5L), class = "data.frame")
期望的输出:真、假、真、真、假
您可以再次尝试使用显式查找模式的正则表达式,例如 (?:apple|orange).*(?:apple|orange)
(pattern <- paste0("(?:", Examplepattern, ")", ".*", "(?:", Examplepattern, ")"))
#[1] "(?:apple|orange).*(?:apple|orange)"
grepl(pattern, Rexample$Statement.Text, ignore.case = TRUE, perl = TRUE)
#[1] FALSE TRUE TRUE FALSE TRUE
您可以使用花括号指定您希望在正则表达式中重复某些内容的次数,例如 {2}
(恰好是它之前的两倍)、{2,5}
(2-5 次)或 {2,}
(2次或更多次)。但是,您需要在要匹配的单词之间留出单词,因此您需要使用 *
(0 次或更多次)量化的通配符 .
。
因此,如果您希望 apple
或 orange
匹配两次(包括 apple
和 orange
,反之亦然),您可以使用
grepl('(apple.*|orange.*){2}', Rexample$Statement.Text, ignore.case = TRUE)
# [1] FALSE TRUE TRUE FALSE TRUE
如果要apple
重复两次或orange
重复两次(但不是apple
一次和orange
一次),分别量化:
grepl('(apple.*){2,}|(orange.*){2}', Rexample$Statement.Text, ignore.case = TRUE)
# [1] FALSE TRUE FALSE FALSE TRUE
我正在尝试使用 grepl 检测术语,但出现了太多误报。我希望可能有一种方法可以要求列表中任何术语的两次成功匹配(我对我的一段数据进行了手动编码,并试图让自动化至少大致对应于此,但我有大约 5是我手动编码时正面次数的两倍)。我没有看到 grepl 接受任何需要多个匹配才能触发 TRUE 的参数。是否有任何方法需要两次匹配才能触发 TRUE 发现?或者还有其他我应该使用的功能吗?
GenericColumn <- cbind(grepl(Genericpattern, Statement$Statement.Text, ignore.case = TRUE))
编辑:
这是一个更具体的例子:
Examplepattern <- 'apple|orange'
ExampleColumn <- cbind(grepl(Examplepattern, Rexample$Statement.Text, ignore.case = TRUE))
和现在一样,所有这些都将通过 grepl 触发 true。我只希望有两个引用的项目触发 true。
示例数据:
Rexample <- structure(list(Statement.Text = structure(c(2L, 1L, 3L, 5L, 4L
), .Label = c("This apple is a test about an apple.", "This is a test about apples.",
"This orange is a test about apples.", "This orange is a test about oranges.",
"This orange is a test."), class = "factor")), .Names = "Statement.Text", row.names = c(NA,
5L), class = "data.frame")
期望的输出:真、假、真、真、假
您可以再次尝试使用显式查找模式的正则表达式,例如 (?:apple|orange).*(?:apple|orange)
(pattern <- paste0("(?:", Examplepattern, ")", ".*", "(?:", Examplepattern, ")"))
#[1] "(?:apple|orange).*(?:apple|orange)"
grepl(pattern, Rexample$Statement.Text, ignore.case = TRUE, perl = TRUE)
#[1] FALSE TRUE TRUE FALSE TRUE
您可以使用花括号指定您希望在正则表达式中重复某些内容的次数,例如 {2}
(恰好是它之前的两倍)、{2,5}
(2-5 次)或 {2,}
(2次或更多次)。但是,您需要在要匹配的单词之间留出单词,因此您需要使用 *
(0 次或更多次)量化的通配符 .
。
因此,如果您希望 apple
或 orange
匹配两次(包括 apple
和 orange
,反之亦然),您可以使用
grepl('(apple.*|orange.*){2}', Rexample$Statement.Text, ignore.case = TRUE)
# [1] FALSE TRUE TRUE FALSE TRUE
如果要apple
重复两次或orange
重复两次(但不是apple
一次和orange
一次),分别量化:
grepl('(apple.*){2,}|(orange.*){2}', Rexample$Statement.Text, ignore.case = TRUE)
# [1] FALSE TRUE FALSE FALSE TRUE