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

R 测试向量是否包含给定元素,r,vector,r-faq,R,Vector,R Faq,如何检查向量是否包含给定值?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 v您可以在%操作符中使用% vec <- c(1, 2, 3, 4, 5) 1 %in% vec # true 10 %in% vec #

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

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

v您可以在%
操作符中使用
%

vec <- c(1, 2, 3, 4, 5)
1 %in% vec # true
10 %in% vec # false
vec函数的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
>w any(w==1)
[1] 真的
>v any(v=='b')
[1] 真的
>任意(v='f')
[1] 假的

还可以查找元素“which”的位置,该元素可用作

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

which(pop==13)
pop
是.element()
使代码更可读,与%
中的
%相同

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
v为此,我非常喜欢grep()和grepl()

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

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

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

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

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

是.element()

用于查找首次发生:

匹配()

用于将所有事件作为索引向量进行查找:

哪个()

用于查找作为逻辑向量的所有事件

==

> 'a' == v
[1] FALSE  TRUE FALSE  TRUE FALSE
编辑:
出于评论中提到的原因,从列表中删除grep()grepl(),有时我会问自己,为什么R不使用contains这个词,让用户更容易地认为“in”包含在“conta(in)s”中;我认为“in”在这种情况下是一个相当简洁的竞争者,也许加上侧面的
%
-符号就是这样。
中的单词
是R中的保留字,用于for循环构造。@greg121 dplyr已经有一个函数,但它的用途不同:在数据帧中选择列。例如
select(iris,contains(“etal”))
。有没有一种简洁的方法可以以给定的精度对实值数字执行此操作?我知道文档中说
Is。元素(x,y)与%y中的x%相同
。但是,我不知道为什么,
is.elements
在混合整数和数字时起作用,而%
中的
%不起作用t@pomber:你能举个例子吗?@pomber它被修复了吗?优越的可读性
是.element()
vs
%in%
是主观的。一种情况是中缀运算符更具可读性,因为它消除了参数顺序中的歧义<代码>水果中的苹果
是有意义的,
苹果中的水果
不是
is.element(苹果,苹果)
is.element(苹果,苹果)
可能都是正确的,这取决于
is.element
函数的实现。
match
不同,哪一个
有时更可取,因为它提供了所有匹配位置(作为一个数组)。虽然这可能不是OP所要求的,但是如果您只想找到不在
Tset
中的元素,那么为什么还要麻烦
which
?您可以直接索引
pop
pop[!pop%in%Tset]
默认情况下,
grep
将正则表达式作为其第一个元素,因此要精确匹配
“b”
,请使用
^e$
或add
,fixed=TRUE
)。不要使用正则表达式进行精确匹配。这是危险的,可能会产生意想不到的结果是的,这是一个糟糕的、不好的、非常糟糕的主意——效率低下,而且肯定会失败。例如,
myvar请注意,这与%
中的
%不同:
any(1==NA)
返回
NA
,其中
1%in%NA
返回
FALSEany(1==NA,NA.rm=TRUE)
返回
FALSE
。如前所述,请勿使用
grep()
或正则表达式来查找精确匹配。获取所有外观,而不仅仅是第一个外观如何?也许我来晚了一点<代码>哪个(v,'b')
。注意参数的顺序。您的
which(v,'b')
会给我一条错误消息:>其中的错误(v,'b'):which的参数不是逻辑语法which(v==b)或任何其他逻辑运算符。在本例中,此操作的返回值为2。如果v是c(“b”,“b”,“c”,“b”,“d”),则返回值(v==b)为1,2,4。
v <- c('z', 'a','b','a','e')
> 'a' %in% v
[1] TRUE
> any('a'==v)
[1] TRUE
> 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