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


518

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


38
有时我问自己为什么R只是不使用包含这个词来使用户更容易
greg121 2013年

12
认为“ in”包含在“ conta(in)s”中;我认为在这种情况下,“在...中”是一个相当简洁的竞争者
树篱

1
也许加上侧翼%-signs。该字in是R的for循环构造中的保留字。
IRTFM '16

@ greg121 dplyr已经具有一个contains函数,但是它具有不同的用途:在数据框中选择一列。例如select(iris, contains("etal"))
Paul Rougieux

是否有一种简洁的方法可以对给定精度的实值数字进行处理?
mlt

Answers:


500

无论是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

如何获得所有的出现,而不仅仅是第一次出现?
StatsSorceress

也许我来晚了。which(v, 'b')。注意参数的顺序。
Niklas Mertsch '18

which(v, 'b')给了我一条错误消息:>其中(v,'b')的错误:'哪一个'的参数不合逻辑
Capt.Krusty 19'Aug

176

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

6
我知道文件说is.element(x, y) is identical to x %in% y。但是,我不知道为什么,is.elements在混合整数和数字时可以使用,%in%但不能使用
庞贝2014年

@pomber:您能举个例子吗?
discipulus

@pomber是固定的吗?
vasili111

2
优越的可读性is.element()%in%主观性。可以说一个中缀运算符更具可读性,因为它消除了参数顺序中的歧义。apple in fruit有道理,fruit in apple没有。is.element(apple, fruit)还是is.element(fruit, apple)根据is.element功能的实现而对。
rileymcdowell

70

我将根据输出对选项进行分组。对于所有示例,假定以下向量。

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()


6
正如此处此处已注释过的,请勿使用grep()或正则表达式来查找完全匹配。
Uwe

69

任何()函数使为可读代码

> 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

9
请注意,这与以下行为有所不同%in%any(1==NA)returns NA,其中1 %in% NAreturns FALSE

@ user3603486:any(1==NA, na.rm=TRUE)返回FALSE
AkselA

36

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

vec <- c(1, 2, 3, 4, 5)
1 %in% vec # true
10 %in% vec # false

19

还可以找到元素“哪个”的位置,该位置可以用作

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))]

which实际上有时是可取的,因为它可以为您提供所有匹配的位置(作为数组),这与不同match。虽然这也许不是什么OP要求,不像stackoverflow.com/questions/1169388/...
菲斯

2
which如果您只想查找不在其中的元素,为什么还要打扰Tset?您可以直接建立索引poppop[!pop%in%Tset]
Houshalter '17

13

为此,我真的很喜欢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

这些功能区分大小写。


10
默认情况下,grep将正则表达式作为其第一个元素,因此要对进行完全匹配"b",请使用^e$或添加, fixed=TRUE
reinierpost

10
请勿将正则表达式用于完全匹配。这很危险,可能会产生意想不到的结果
David Arenburg

9
是的,这是一个可怕的,没有好的,非常糟糕的主意-效率低下,而且肯定会失败。即使'b'不存在,Eg myvar <- 'blah'; grepl('b', myvar, fixed=TRUE)也会返回。TRUEmyvar
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.