ste*_*sou 3 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))
Run Code Online (Sandbox Code Playgroud)
但是,当我查看语法时,它似乎应该选择每一行,其中y是x中的一个值(?)所以在示例中,所有情况11和12(y)出现在"月"中" (X).
?"%in%"不会让我更清楚.显然我错过了一些东西,但有人可以详细说明这个功能是如何工作的吗?
它似乎应该选择每一行,其中y是x中的一个值(?)所以在该示例中,11和12出现在"月"中的所有情况.
如果您不了解查看示例的行为,请自行尝试.例如,您可以这样做:
> c(1,2,3) %in% c(2,4,6)
[1] FALSE TRUE FALSE
Run Code Online (Sandbox Code Playgroud)
因此它看起来%in%为您提供了TRUE与FALSE第一个参数(之前的一个%in%)中的每个项对应的向量和值.让我们尝试另一个:
> c(1,2,3) %in% c(2,4,6,8,10,12,1)
[1] TRUE TRUE FALSE
Run Code Online (Sandbox Code Playgroud)
这证实了这一点:返回向量中TRUE的第一项是第一个参数中的第一个项是否在第二个参数中的任何位置找到,依此类推.将结果与您使用的结果进行比较match():
> match(c(1,2,3), c(2,4,6,8,10,12,1))
[1] 7 1 NA
Run Code Online (Sandbox Code Playgroud)
因此,match()和之间的区别在于%in%前者为第一个参数中每个项目的第一个匹配的第二个参数提供了实际位置,而%in%给出了一个逻辑向量,它只是告诉您第一个参数中的每个项目是否出现在第二.
在Wickham的书籍示例中,month是一个代表各种航班发生月份的数值向量.所以为了论证,有点像:
> month <- c(2,3,5,11,2,9,12,10,9,12,8,11,3)
Run Code Online (Sandbox Code Playgroud)
使用%in%运算符可以将该向量转换为问题的答案是11月或12月的这个航班吗?像这样:
> month %in% c(11,12)
[1] FALSE FALSE FALSE TRUE FALSE FALSE TRUE FALSE FALSE TRUE FALSE TRUE
[13] FALSE
Run Code Online (Sandbox Code Playgroud)
它为您提供了一个逻辑向量,即一个真/假值列表.该filter()函数使用该逻辑向量从flights表中选择相应的行.一起使用,filter并%in%回答问题11月或12月发生的所有航班是什么?
如果你转过身%in%来反而问:
> c(11,12) %in% month
[1] TRUE TRUE
Run Code Online (Sandbox Code Playgroud)
你真的只是问第11个月和第12个月的每个航班都有吗?
我可以想象,一个大的向量是否在一个只有两个值的向量中"可能看起来很奇怪".考虑读x %in% y作每个值是否x也来自y?