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

Test if a vector contains a given element

提问人:medriscoll 提问时间:7/23/2009 最后编辑:zx8754medriscoll 更新时间:7/17/2022 访问量:941614

问:

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

矢量 R-FAQ

评论

47赞 greg121 3/5/2013
有时我会问自己,为什么 R 只是不使用“包含”这个词来让它更方便用户
22赞 hedgedandlevered 3/12/2016
认为“in”包含在“conta(in)s”中;我认为,在这种情况下,“in”是一个相当简洁的竞争者
1赞 IRTFM 7/9/2016
也许加上侧翼标志就是这样。该词是 R 中用于 for 循环构造的保留字。%in
0赞 Paul Rougieux 3/14/2018
@greg121 dplyr 已经有一个 contains 函数,但它用于不同的目的:选择数据框中的列。例如。select(iris, contains("etal"))
0赞 mlt 11/17/2018
有没有一种简洁的方法可以对具有给定精度的实值数字执行此操作?

答:

600赞 medriscoll 7/23/2009 #1

(返回第一个外观)和(返回布尔值)函数都是为此而设计的。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

评论

0赞 StatsSorceress 3/15/2018
获得所有外观,而不仅仅是第一次出现呢?
1赞 Niklas Mertsch 12/20/2018
也许我来得有点晚了。.注意参数的顺序。which(v, 'b')
0赞 Capt.Krusty 8/17/2019
你给了我一条错误消息: >Error in which(v, 'b') : argument to 'which' is not logicalwhich(v, 'b')
1赞 khtad 6/27/2020
语法是 which(v == b) 或任何其他逻辑运算符。在这种情况下,由此产生的回报为 2。如果 v 是 c(“b”, “b”, “c”, “b”, “d”),则 (v == b) 的返回值为 1, 2, 4。
37赞 ars 7/23/2009 #2

您可以使用运算符:%in%

vec <- c(1, 2, 3, 4, 5)
1 %in% vec # true
10 %in% vec # false
71赞 Dan Goldstein 8/21/2009 #3

any() 函数使代码可读

> 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

评论

11赞 3/23/2017
请注意,这的行为与 : returns , where returns 不同。%in%any(1==NA)NA1 %in% NAFALSE
0赞 AkselA 4/24/2019
@user3603486:返回 。any(1==NA, na.rm=TRUE)FALSE
20赞 Armin 8/18/2013 #4

还要找到元素“which”的位置,可以用作

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

which(pop==13)

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

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

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

pop[which(!(pop%in%Tset))]

评论

0赞 Fizz 2/8/2015
which有时实际上更可取,因为它为您提供了所有匹配的位置(作为数组),这与 .虽然这可能不是 OP 所要求的,但与 stackoverflow.com/questions/1169388/ 不同......match
2赞 Houshalter 2/21/2017
如果你只是想找到不在里面的元素,为什么还要烦恼呢?您可以直接索引;whichTsetpoppop[!pop%in%Tset]
204赞 Justin Nafe 10/2/2013 #5

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

评论

8赞 pomber 12/28/2014
我知道文档上说.但是,我不知道为什么,在混合整数和数字时有效,但不行is.element(x, y) is identical to x %in% yis.elements%in%
0赞 discipulus 6/27/2017
@pomber : 您能举个例子吗?
0赞 vasili111 9/22/2019
@pomber修复的?
9赞 rileymcdowell 1/4/2020
卓越的可读性 vs 是主观的。可以说,中缀运算符更具可读性,因为它消除了参数顺序中的歧义。 有道理,没有。 或者两者都可能是正确的,具体取决于函数的实现。is.element()%in%apple in fruitfruit in appleis.element(apple, fruit)is.element(fruit, apple)is.element
12赞 ojdajuiceman 12/3/2015 #6

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

grep() 返回一个整数向量,指示匹配项的位置。

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

grep("b", yo)
[1] 3 4

grepl() 返回一个逻辑向量,匹配位置为“TRUE”。

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

grepl("b", yo)
[1] FALSE FALSE  TRUE  TRUE FALSE FALSE

这些函数区分大小写。

评论

12赞 reinierpost 1/7/2016
默认情况下,将正则表达式作为其第一个元素,因此要对 进行精确匹配,请使用或添加 )。grep"b"^e$, fixed=TRUE
12赞 David Arenburg 9/11/2016
不要使用正则表达式进行完全匹配。这很危险,可能会产生意想不到的结果
10赞 3/23/2017
是的,这是一个可怕的、不好的、非常糟糕的主意——效率低下,保证会失败。例如 即使 'b' 不在 中,也会返回。myvar <- 'blah'; grepl('b', myvar, fixed=TRUE)TRUEmyvar
120赞 ishandutta2007 6/7/2017 #7

我将根据输出对选项进行分组。假设所有示例都采用以下向量。

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

要检查存在:

%英寸%

> 'a' %in% v
[1] TRUE

任意()

> any('a'==v)
[1] TRUE

is.element()

> is.element('a', v)
[1] TRUE

对于查找首次出现的情况:

匹配()

> match('a', v)
[1] 2

要查找所有出现项作为索引向量:

其中()

> which('a' == v)
[1] 2 4

要查找所有出现的情况作为逻辑向量

==

> 'a' == v
[1] FALSE  TRUE FALSE  TRUE FALSE

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

评论

8赞 Uwe 6/13/2017
正如这里这里已经评论过的,不要使用或正则表达式来查找完全匹配。grep()
1赞 Quinten 7/17/2022 #8

检查向量中是否存在元素的另一种选择是使用中的语法,如下所示:%in{}%inops

library(inops)
#> 
#> Attaching package: 'inops'
#> The following object is masked from 'package:base':
#> 
#>     <<-
v <- c('a','b','c','e')
v %in{}% c("b")
#> [1] FALSE  TRUE FALSE FALSE

创建于 2022-07-16 由 reprex 软件包 (v2.0.1)