我很难用“通俗易懂的英语”来理解R中的%in%操作符。我已经看到了多个使用它的代码示例,但对于如何读取它并没有给出明确的解释。
例如,我找到了管道操作符%>%的术语,它建议将其读为“然后”。我正在为%in%操作符寻找类似的翻译。
在题为“数据转换”的第五章“数据科学”一书中,有一个飞行数据集的例子如下:
以下代码查找11月或12月起飞的所有航班: 过滤器(航班,月== 11个月== 12)
x %in% y是解决这个问题的有效方法之一.这将选择x是y中值之一的每一行。我们可以使用它重写上面的代码: nov_dec <- filter(航班,% c(11,12)月%)
当我阅读“x %in% y是解决这个问题的一个有用的缩写”,然后查看nov_dec示例时,它似乎被理解为“选择每个行,其中月份(x)是c(11,12) (y)中的值之一”,这对我来说是没有意义的。
然而,我的大脑想把它读成“在月份专栏中查找11和12”之类的内容。在这个例子中,x应该是11和12的值,%in%操作符正在检查这些值是否在y中,后者将是月份列。我的大脑正在从右到左阅读这个例子。
但是,我发现的所有代码示例似乎都表明,%y中的x%应该从左读到右,而不是从右读到左。
有人能帮我读一下%in%操作符吗?请用外行的术语。请举例说明。
发布于 2021-06-24 23:04:58
我认为你的脱节是理解如何将"in“应用于向量。你写道,你想把它读成“在月份专栏中查找11和12”。你真的可以这样想。你的例子是:
nov_dec <- filter(flights, month %in% c(11, 12))这可以用通俗易懂的英语表达为:
告诉我
c(11, 12)中的值之一在月份列中的所有航班
但我们也可以说,11和12是“在”向量c(11, 12)。这就是从左到右的读数:
告诉我每个月的航班都是矢量
c(11, 12)。
或者,用稍微不同的表达方式和更详细的表达:
给我所有的航班,它的月份等于向量
c(11, 12)中的一个值。
这在概念上类似于使用一行|操作符(month == 11 | month == 12),但最好不要认为它们完全等价。您不是将x与y中的每个值显式比较,而是问“x是否等于y中的一个值?”这和说“请关掉灯”和说“请走到墙上的盘子上,把小木棍往下拉”是不同的。它表达的是您想要的,而不是如何解决它,这使您的代码更加可读性,代码读取比它编写的更多,所以这是很重要的!
现在我已经走出了我的领域--同样,我不知道R在这里到底做了什么--但是回答这个问题的基本方法也可能不一样。它可能使用二进制搜索算法来确定x是否在y中。
发布于 2021-04-15 17:41:22
如果我真的想“拼出来”,我会将x %in% y读为“对于每个x值,它在y中吗?”
nov_dec <- filter(航班,% c(11,12)月%)“ 当我阅读“这个问题的有用的缩写是%x%(%)(% y )”,然后看nov_dec示例时,它似乎被理解为“选择每个行,其中月份('x')是c(11,12) ('y')中的一个值,这对我来说没有意义。 然而,我的大脑想把它读成“在月份专栏中寻找11和12”之类的东西。在本例中,“x”应该是11和12的值,
%in%运算符正在检查这些值是否在'y‘中,后者将是月份列。我的大脑正在从右到左阅读这个例子。
左派和右派的问题都是关于你在问什么的。x x %in% y在问(用我上面详细的措辞),"for value,是y吗?“有了这个短语,我们知道对TRUE或FALSE中的每一个项目都会有一个答案。
如果我们把它再扩展一点,这可能会变得更清楚--两个常见的相关问题是“x值在y中有吗?”以及“所有的x值都在y中”吗?这些代码可以自然地编码为
any(x %in% y) # Are any x values in y?
all(x %in% y) # Are all x values in y?至少对我来说,这看起来很自然,他们用的是从左到右的阅读。尝试在这里使用从右到左的读数会变得很复杂,比如“在y __中查找x值,您是否用匹配覆盖了每个x值?”
发布于 2021-04-15 17:24:47
这其实是个很好的问题。想一想这里的字面性质:
当你使用%in%时,它是代替‘或’语句的--这里有这些语句吗?
answers = data.frame(ans = sample(rep(c("yes","no","maybe"),
each = 3, times = 2)),
ind = 1:9)
# yes or no?
answers[answers$ans == "yes"|answers$ans == "no",]
# ans ind
# 1 yes 1
# 2 yes 2
# 4 no 4
# 5 yes 5
# 6 no 6
# 8 no 8
# 10 yes 1
# 12 no 3
# 13 no 4
# 16 yes 7
# 17 no 8
# 18 yes 9
# now about %in%
answers[answers$ans %in% c("yes","no"),]
# ans ind
# 1 yes 1
# 2 yes 2
# 4 no 4
# 5 yes 5
# 6 no 6
# 8 no 8
# 10 yes 1
# 12 no 3
# 13 no 4
# 16 yes 7
# 17 no 8
# 18 yes 9
# yes and no?
answers[answers$ans == c("yes","no"),]
# ans ind
# 1 yes 1
# 4 no 4
# 5 yes 5
# 6 no 6
# 8 no 8
# 12 no 3
# what happened here? were you expecting that?
# this checked the first row for yes,
# the second row for no,
# the third row for yes,
# the fourth row for no and so on...https://stackoverflow.com/questions/67112634
复制相似问题