2017-09-05 61 views
3

我对理解%in%有困难。在Hadley Wickham的书“R for data science”的第5.2.2节中,它说:“这个问题的一个有用的缩写是x %in% y。这将选择每一行,其中x是y中的一个值。那么这个例子说明:理解对%的解释的困难%

nov_dec <- filter(flights, month %in% c(11, 12)) 

然而,我当我看语法,看样子,应该选择每一行,其中y是x中的值之一,所以在这个例子中,所有的(?) “月”(x)中出现11和12(y)的情况。

?"%in%"并没有使我对此更清楚。很显然,我错过了一些东西,但是有人可以确切地说明这个功能的工作原理吗?

+4

我倾向于将%y中的x%读为“x在y中”。 '%in%'操作符是'match'的有用包装器,其中y是'match'的“table”参数。也就是说,y是用于比较的一组值。如果一个x的元素在y中,'%in%'操作符返回一个逻辑向量x的长度为TRUE。类似地,'match'返回长度为x的inteder向量与表(y)中x的位置(索引)。 – lmo

+0

如果您熟悉SQL,那么这与sql语句相同:'select * from from flights where month in(11,12)'。 –

+0

@lmo我认为这是一个混淆的地方,尽管......与具有多个值的向量可以“在”具有2个值的向量中是违反直觉的。如果你将它看作“x的元素在y中”,那么理解x中的所有x不必包含在y中会容易一些。 – Caleb

回答

7

看来,应该选择每一行,其中y是值之一在x(?)所以在这个例子中,11和12出现在“月”中的所有情况。

如果您不了解查看示例的行为,请自行尝试。例如,你可以这样做:

> c(1,2,3) %in% c(2,4,6) 
[1] FALSE TRUE FALSE 

所以看起来%in%为您提供了对应于每个第一个参数(一%in%之前)项目的TRUEFALSE值的向量。让我们尝试另:

> c(1,2,3) %in% c(2,4,6,8,10,12,1) 
[1] TRUE TRUE FALSE 

也证实了这一点:在返回的向量的第一个项目是TRUE如果在第一个参数中的第一项第二个参数中找到任何地方,等等。这个结果比较你开始使用match()之一:

> match(c(1,2,3), c(2,4,6,8,10,12,1)) 
[1] 7 1 NA 

所以match()%in%之间的区别在于,前者让你在第一个参数中每个项目的第一场比赛的第二个参数的实际位置,而%in%为您提供了一个逻辑向量,它告诉您第一个参数中的每个项目是否出现在第二个参数中。

在Wickham的书籍范例中,month是表示各航班发生月份的值的向量。因此,对于参数的缘故,有点像:

> month <- c(2,3,5,11,2,9,12,10,9,12,8,11,3) 

使用%in%操作,让您打开该向量到问题的答案这是飞行本月11或12?这样的:

> month %in% c(11,12) 
[1] FALSE FALSE FALSE TRUE FALSE FALSE TRUE FALSE FALSE TRUE FALSE TRUE 
[13] FALSE 

它给你一个合理的载体,即真/假值的列表。 filter()函数使用该逻辑向量从flights表中选择相应的行。一起使用,filter%in%回答这个问题在11或12个月内发生的所有航班是什么?

如果你变成了%in%周围,转而问道:

> c(11,12) %in% month 
[1] TRUE TRUE 

你真的只是问是否有每个月11月和12中的任何航班吗?

我可以想象,询问一个大矢量是否“在”一个只有两个值的矢量中似乎很奇怪。考虑将x %in% y编为来自x的每个值是否也在y

+1

非常感谢您提供了完整的解释。我现在明白了! –

0

此明确表示:从X也沿y 了解的最好办法值一为例:

x <- 1:10 # numbers from 1 to 10 
y <- (1:5)*2 # pair numbers between 2 and 10 

y %in% x # all pair numbers between 2 and 10 are in numbers from 1 to 10 

x %in% y #only pair numbers are return as True 
2

一个快速的锻炼应该足够证明功能的工作原理:

> x <- c(1, 2, 3, 4) 
> y <- 4 
> z <- 5 

> x %in% y 
[1] FALSE FALSE FALSE TRUE 

所以数字矢量x的第四个要素是存在于数字矢量y

> y %in% x 
[1] TRUE 

y的第一个元素(只有一个)是x

> z %in% x 
[1] FALSE 
> x %in% z 
[1] FALSE FALSE FALSE FALSE 

而且,无论zx也没有任何的xz

另请参阅帮助所有匹配的功能与?match

1

我想了解它的工作原理是有些语义,一旦你可以说,它在逻辑上则语法工作本身了。

关键是在你的头脑中创建一个句子,当你读代码时,当你在每一行工作时,包括apply的上下文,布尔逻辑根据包含的内容包含或排除行在“按列表过滤”%in% c()

nov_dec <- filter(flights, month %in% c(11, 12)) 

在这种情况下为您的例如上面应该读这样的:

“设置可变nov_dec等于行中flights,其中变量柱month(从那些行)是在该子集中列表c(11,12)。“

从顶部r作品下来,它看起来在本月,如果它要么是1112,在列表中的两个变量,那么它包括他们nov_dec,OTH它只是继续下去。