【问题标题】:Why in R are grep & !grep not logically consistent when grepl and !grepl ARE logically consistent?当 grepl 和 !grepl 逻辑一致时,为什么在 R 中 grep 和 !grep 在逻辑上不一致?
【发布时间】:2016-07-09 05:40:46
【问题描述】:

R 函数 grep!grep (NOT grep) 在逻辑上不一致;不像 grepl!grepl (NOT grepl),它们在逻辑上是一致的。

grepl 返回一个长度等于正在搜索的项目数的逻辑向量。例如,如果在 5 项向量的第 2 项和第 3 项中找到目标,则返回以下内容:

FALSE TRUE TRUE FALSE FALSE 

如果grepl!grepl替换,则返回“相反”的逻辑结果:

TRUE FALSE FALSE TRUE TRUE 

grep,另一方面返回找到的项目的 2 个位置的向量:2 3

!grep 在同一场景中返回什么?逻辑上它应该返回1 4 5,而不是返回FALSE FALSE。这怎么可能是一个逻辑一致的返回值?谁能解释一下?

【问题讨论】:

  • 由于grep 返回integers 的0+ 向量,因此未在它们上定义!(反转逻辑)运算符。你能确定地告诉我invert_logic 5:7 是什么意思吗? (如果你知道向量的长度,那么你就可以推断出1:4,8:n,但这是冒昧的。)由于grepl 返回了logicals 的0+ 向量,所以说invert_logic c(T,T,F,T) 是有意义的,因为你正在索引具有相同长度的逻辑向量(反转或其他)的向量,你很好。 (顺便说一句:letters[ -grep("[f-h]", letters ] 正在有效地反转。)
  • 试试grep(..., invert = TRUE)。我想这就是你想要的。
  • 1) grep 返回匹配模式的索引,而grepl 返回一个逻辑向量; 2) ! 运算符将其参数强制为logical。例如尝试!c(0,2,4),你会发现它等同于!as.logical(c(0,2,4)); 3) 检查grepinvert 参数。
  • @r2evans “!(反转逻辑)运算符未在整数上定义”不正确。您可以在integernumeric 向量上使用!
  • @r2evans 我明白了。 OP 应该意识到!grep 不是 一个函数(正如它们似乎暗示的那样),而是两个函数,! 运算符应用于grep 产生的结果和不会改变 grep 的行为。

标签: r grepl


【解决方案1】:

您正在寻找grep()invert 参数。

来自help(grep),在参数下:

反转 - 合乎逻辑。如果TRUE 返回不匹配的元素的索引或值

听起来正是您想要的。让我们看一个例子。

x <- c("ab", "cd", "bc", "def", "abc")

grep("b", x)
# [1] 1 3 5
grep("b", x, invert=TRUE)
# [1] 2 4

【讨论】:

    【解决方案2】:

    grep(value = FALSE) - 返回产生匹配的 x 元素的索引向量。

    grepl 返回一个逻辑向量(x 的每个元素是否匹配)。

    grep vs grepl in R

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-27
      • 1970-01-01
      相关资源
      最近更新 更多