理解%in%的解释时遇到麻烦

时间:2017-09-05 13:24:12

标签: r subset tidyverse

我无法理解%in%。在第5.2.2节的Hadley Wickham的书“R for data science”中,它说:“这个问题的一个有用的简写是x %in% y。这将选择x是y中的一个值的每一行。”然后给出了这个例子:

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

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

?"%in%"并没有让我更清楚。显然我错过了一些东西,但有人可以详细说明这个功能是如何工作的吗?

4 个答案:

答案 0 :(得分:7)

  

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

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

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

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

> 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中的每个值是否也在cordova plugin add cordova-plugin-http

答案 1 :(得分: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

z中的xx中的任何z都不在?match

另请参阅install.packages('tm',dependencies = TRUE) library('tm')

所有匹配功能的帮助

答案 2 :(得分:1)

我认为理解它是如何工作的有点语义,一旦你可以逻辑地说它,那么语法就会自行解决。

关键是在阅读代码时在脑中创建一个句子,其中包括apply的上下文,当你在每行中工作时,以及布尔逻辑包含或排除基于行的行&#34;过滤列表&#34; %in% c( )

中包含的内容
 nov_dec <- filter(flights, month %in% c(11, 12))

在这种情况下,上面的示例应该如下所示:

&#34;将变量nov_dec设置为flights中的行子集,其中变量列month(来自这些行)位于列表{{1}中}。 &#34;

c(11,12)从上到下工作时,它会查看月份,如果它是r11,列表中的两个变量,则它包含在{{ 1}},否则它只会继续。

答案 3 :(得分: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