测试向量是否包含给定元素

med*_*oll 483 r vector r-faq

如何检查向量是否包含给定值?

med*_*oll 475

无论是match()(返回第一外观)和%in%(返回一个布尔)功能被设计用于此.

v <- c('a','b','c','e')

'b' %in% v
## returns TRUE

match('b',v)
## returns the first location of 'b', in this case: 2
Run Code Online (Sandbox Code Playgroud)


Jus*_*afe 168

is.element() 使代码更易读,并且与之相同 %in%

v <- c('a','b','c','e')

is.element('b', v)
'b' %in% v
## both return TRUE

is.element('f', v)
'f' %in% v
## both return FALSE

subv <- c('a', 'f')
subv %in% v
## returns a vector TRUE FALSE
is.element(subv, v)
## returns a vector TRUE FALSE
Run Code Online (Sandbox Code Playgroud)

  • 我知道文档说`is.element(x,y)与%y'中的x%相同.但是,我不知道为什么,`is.elements`在混合整数和数字时起作用,`%in%`不起作用 (6认同)
  • `is.element()` 与 `%in%` 相比的优越可读性是主观的。中缀运算符更具可读性,因为它消除了参数顺序的歧义。“水果中的苹果”有道理,“苹果中的水果”则不然。`is.element(apple,fruit)` 或 `is.element(fruit, apple)` 可能都是正确的,具体取决于 `is.element` 函数的实现。 (6认同)

Dan*_*ein 67

任何()函数使得对于可读代码

> w <- c(1,2,3)
> any(w==1)
[1] TRUE

> v <- c('a','b','c')
> any(v=='b')
[1] TRUE

> any(v=='f')
[1] FALSE
Run Code Online (Sandbox Code Playgroud)

  • 请注意,这与`%in%`的行为不同:`any(1 == NA)`返回`NA`,其中`%NA'中的1%返回`FALSE`. (8认同)

ish*_*007 57

我将根据输出对选项进行分组.假设所有例子都有以下矢量.

v <- c('z', 'a','b','a','e')
Run Code Online (Sandbox Code Playgroud)

用于检查存在:

%在%

> 'a' %in% v
[1] TRUE
Run Code Online (Sandbox Code Playgroud)

任何()

> any('a'==v)
[1] TRUE
Run Code Online (Sandbox Code Playgroud)

is.element()

> is.element('a', v)
[1] TRUE
Run Code Online (Sandbox Code Playgroud)

寻找第一次出现:

比赛()

> match('a', v)
[1] 2
Run Code Online (Sandbox Code Playgroud)

为了找到所有出现作为指数的向量:

哪一个()

> which('a' == v)
[1] 2 4
Run Code Online (Sandbox Code Playgroud)

用于查找所有出现的逻辑向量:

==

> 'a' == v
[1] FALSE  TRUE FALSE  TRUE FALSE
Run Code Online (Sandbox Code Playgroud)

编辑:从列表中删除grep()grepl(),原因是注释中提到的原因

  • 正如已经评论[这里](/sf/ask/81847391/#comment66181358_34056066)和[这里]( /sf/ask/81847391/#comment73025314_34056066),不要使用`grep()`或常规找到完全匹配的表达式. (6认同)

ars*_*ars 34

您可以使用%in%运营商:

vec <- c(1, 2, 3, 4, 5)
1 %in% vec # true
10 %in% vec # false
Run Code Online (Sandbox Code Playgroud)


小智 18

还要找到元素的位置"哪个"可以用作

pop <- c(3,4,5,7,13)

which(pop==13)
Run Code Online (Sandbox Code Playgroud)

并且要找到目标向量中未包含的元素,可以这样做:

pop <- c(1,2,4,6,10)

Tset <- c(2,10,7)   # Target set

pop[which(!(pop%in%Tset))]
Run Code Online (Sandbox Code Playgroud)

  • 如果您只想查找不在Tset中的元素,为什么还要麻烦“哪个”呢?您可以直接将`pop`索引;`pop [!pop%in%Tset]` (2认同)

小智 12

为此,我真的很喜欢grep()和grepl().

grep()返回一个整数向量,表示匹配的位置.

yo <- c("a", "a", "b", "b", "c", "c")

grep("b", yo)
[1] 3 4
Run Code Online (Sandbox Code Playgroud)

grepl()返回一个逻辑向量,匹配位置为"TRUE".

yo <- c("a", "a", "b", "b", "c", "c")

grepl("b", yo)
[1] FALSE FALSE  TRUE  TRUE FALSE FALSE
Run Code Online (Sandbox Code Playgroud)

这些函数区分大小写.

  • 默认情况下,`grep`将正则表达式作为其第一个元素,因此要对"b"`进行精确匹配,要么使用`^ e $`,要么添加`,fixed = TRUE`). (10认同)
  • 不要使用正则表达式进行完全匹配.这很危险,可能会产生意想不到的结果 (9认同)
  • 是的,这是一个可怕的,没有好的,非常糟糕的想法 - 低效且保证会破裂.例如`myvar < - 'blah'; grepl('b',myvar,fixed = TRUE)`将返回`TRUE`,即使'b'不在`myvar`中. (9认同)