难以理解 %in% 的解释

Trouble with understanding explanation of %in%

我无法理解 %in%。在 Hadley Wickham 的书 "R for data science" 的第 5.2.2 节中说,"A useful short-hand for this problem is x %in% y. This will select every row where x is one of the values in y." 然后给出这个例子:

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

但是,当我查看语法时,它似乎应该选择 y 是 x(?) 中的值之一的每一行所以在这个例子中,所有 11 和 12 (y ) 出现在 "month" (x).

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

这明确表示:来自 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

It appears that it should be selecting every row where y is one of the values in x(?) So in the example, all the cases where 11 and 12 appear in "month."

如果您不理解示例中的行为,请自己尝试一下。例如,您可以这样做:

> 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

它为您提供了一个逻辑向量,即 true/false 值的列表。 filter() 函数将该逻辑向量用于 select 来自 flights table 的对应行。 filter%in% 一起使用可以回答问题 第 11 个月或第 12 个月发生的所有航班是多少?

如果你把 %in% 转过来问:

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

你真的只是在问 11 月和 12 月每个月都有航班吗?

我可以想象,问一个大向量是否是 "in" 只有两个值的向量似乎很奇怪。考虑阅读 x %in% y 作为 x 中的每个值是否也在 y 中?

一个快速练习应该足以演示该函数的工作原理:

> 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 不在 x 中,x 也不在 z 中。

另请参阅所有与 ?match

匹配的函数的帮助

我认为理解它是如何工作的在某种程度上是语义化的,一旦你能合乎逻辑地表达出来,语法就会自行解决。

关键是在阅读代码时在脑海中创建一个句子,其中包括 apply 的上下文,因为您逐行浏览每一行,布尔逻辑包括或排除行基于 "filter by list "%in% c( ).

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

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

"Set the variable nov_dec equal to the subset of rows in flights, where the variable column month (from those rows) is in the list c(11,12). "

由于 r 从上到下工作,它查看月份,如果它是 1112,则列表中的两个变量,然后将它们包含在nov_dec,否则继续。