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

评论

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

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

也许是在侧面加上了%符号。在for循环中,in中的单词是R中保留的单词。

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

对于给定精度的实数值,是否有一种简便的方法?

#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


评论


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

–StatsSorceress
18 Mar 15 '18 at 0:54

也许我来晚了。其中(v,'b')。注意参数的顺序。

–尼古拉斯·默特奇(Niklas Mertsch)
18/12/19在19:40

您的which(v,'b')给我一条错误消息:>其中which(v,'b')的错误:'which'的参数不符合逻辑

–锈迹斑斑的
19年8月17日在10:08



语法是which(v == b)或任何其他逻辑运算符。在这种情况下,从此返回的值为2。如果v为c(“ b”,“ b”,“ c”,“ b”,“ d”),则返回((v == b))为1 2 4

–khtad
6月26日21:33

#2 楼

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


评论


我知道文档说is.element(x,y)等同于x%in%y。但是,我不知道为什么is.elements在混合整数和数字时起作用,而%in%不起作用

–pomber
2014年12月28日下午6:21

@pomber:您能举个例子吗?

–纪律
17年6月27日在6:24

@pomber是固定的吗?

–vasili111
19-09-21在23:28

较高的可读性是.element()与%in%是主观的。可以说一个中缀运算符更具可读性,因为它消除了参数顺序中的歧义。水果中的苹果很有意义,苹果中的水果却没有。 is.element(苹果,水果)或is.element(水果,苹果)可能都正确,这取决于is.element函数的实现。

–rileymcdowell
1月3日在16:36



#3 楼

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

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


检查存在性:

%in%

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


any()

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


is.element()

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


用于查找首次出现:

match()

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


用于查找所有出现的索引向量:

which()

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


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

==

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


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

评论


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

– Uwe
17年6月13日在10:04

#4 楼

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


评论


请注意,这与%in%的行为不同:any(1 == NA)返回NA,其中1%in%NA返回FALSE。

–user3603486
17年3月23日在1:34

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

– AkselA
19年4月23日在20:57

#5 楼

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

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


#6 楼

另外,要找到可用作“
”元素的位置,并找到目标向量中不包含的元素,可以这样做:

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

which(pop==13)


评论


实际上有时是可取的,因为与匹配不同,它可以为您提供所有匹配位置(作为数组)。尽管这可能不是OP要求的,但不同于stackoverflow.com/questions/1169388/…

–嘶嘶声
2015年2月7日在16:27



如果您只想查找不在Tset中的元素,为什么要打扰呢?您可以直接索引pop; pop [!pop%in%Tset]

–豪舍特
17年2月20日在23:11

#7 楼

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


这些函数区分大小写。

评论


默认情况下,grep将正则表达式作为其第一个元素,因此要使用“ ^ e $”或“ add”(固定为TRUE)对“ b”进行精确匹配。

– reinierpost
16年1月7日在7:45



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

–大卫·阿伦堡(David Arenburg)
16 Sep 10'在17:54

是的,这是一个糟糕的,无用的,非常糟糕的主意-效率低下并且一定会被打破。例如。 myvar <-'blah';即使'b'不在myvar中,grepl('b',myvar,fixed = TRUE)也会返回TRUE。

–user3603486
17 Mar 23 '17 at 1:31