我无法理解%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%"
并没有让我更清楚。显然我错过了一些东西,但有人可以详细说明这个功能是如何工作的吗?
答案 0 :(得分:7)
看来它应该选择每一行,其中y是x中的一个值(?)所以在这个例子中,11和12出现在“月”中的所有情况。
如果您不了解查看示例的行为,请自行尝试。例如,您可以这样做:
> c(1,2,3) %in% c(2,4,6)
[1] FALSE TRUE FALSE
所以看起来%in%
为您提供了TRUE
和FALSE
值的向量,这些值对应于第一个参数中的每个项目(%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
中的x
和x
中的任何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)
从上到下工作时,它会查看月份,如果它是r
或11
,列表中的两个变量,则它包含在{{ 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