【问题标题】:How do you read the %in% operator in plain English?您如何用简单的英语阅读 %in% 运算符?
【发布时间】:2021-07-10 17:40:41
【问题描述】:

我正在为如何用“简单的英语”术语阅读 R 中的 %in% 运算符而苦苦挣扎。我已经看到了多个使用它的代码示例,但没有清楚地解释如何阅读它。

例如,我发现管道运算符%>% 的术语建议将其读作“然后”。我正在为%in% 运算符寻找类似的翻译。

R for Data Science一书中标题为“数据转换”的第 5 章中,有一个来自航班数据集的示例,内容如下:

以下代码查找在 11 月或 12 月起飞的所有航班:

filter(flights, month == 11 | month == 12)

这个问题的一个有用的简写是x %in% y。这将选择 x 是 y 中的值之一的每一行。我们可以用它来重写上面的代码:

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

当我读到“这个问题的一个有用的简写是x %in% y”,然后再看nov_dec的例子,似乎这应该被理解为“选择月份所在的每一行(x ) 是 c(11,12) (y) 中的值之一,”这对我来说没有意义。

但是我的大脑想将其解读为“在月份列中查找 1112”。在此示例中,x 似乎应该是 1112 的值,%in% 运算符正在检查这些值是否在 y 中,这将是月份列。我的大脑正在从从右到左阅读这个例子。

但是,我发现的所有代码示例似乎都表明这个 x %in% y 应该从左到右而不是从右到左阅读。

谁能帮我阅读外行术语中的%in% 运算符吗?示例将不胜感激。

【问题讨论】:

  • %in% 将返回一个逻辑向量for each element of x 来回答这个问题,x 是否在 y 中找到?一次考虑一个元素:是y 中的x 的第一个元素,是y 中的x 的第二个元素,依此类推。
  • x的值是否在向量y中找到?
  • A %in% B 询问 A 中的值是否在称为 B 的向量(或列表)内。您可以在 filter() 函数中改进其实现的描述为“选择那些变量 x 中的值存在于列表 y 的值中的行”。
  • 具体来说,比如x = 12y = c(11, 12)。在这种情况下,x %in% y 询问12 是否在向量c(11, 12) 中。因为它是,x %in% y 返回TRUE。说z = 13,然后你问z %in% y,然后你得到FALSE,因为13不是向量c(11, 12)中的元素。换句话说,过滤器示例保留数据集中flights 中的行,其中month1112,并删除所有其他行。
  • 它可能是月份的数字表示。例如,如果月份是六月和month=6,那么x = month = 6 那么x %in% y 可以返回FALSE,因为6 不等于1112。如果月份是 12 月的数字表示,则此语句将为 TRUE

标签: r operators terminology


【解决方案1】:

如果我想真正“拼出来”,我会将x %in% y 读作“对于每个x 值,它是否在y 中”?

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

当我读到“这个问题的一个有用的简写是 x %in% y”,然后再看 nov_dec 的例子,似乎这应该被理解为“选择月份('x' ) 是 c(11,12) ('y') 中的值之一,这对我来说没有意义。

但是我的大脑想将其解读为“在月份列中查找 11 和 12”。在此示例中,“x”似乎应该是 11 和 12 的值,%in% 运算符正在检查这些值是否在“y”中,即月份列。我的大脑从右到左阅读这个例子。

左右对决就是你要问的问题。 x %in% y 正在询问(使用我上面的详细措辞),“对于每个 x,它是否在 y 中?”有了这个措辞,我们知道x 中的每个项目都会得到答案(TRUEFALSE)。

如果我们进一步扩展它,这实际上可能会变得更清楚 - 两个常见的相关问题是“y 中有任何x 值吗?”和“y 中的所有x 值”?这些可以自然地编码为

any(x %in% y)  # Are any x values in y?  
all(x %in% y)  # Are all x values in y?

至少对我来说,这些看起来很自然,而且它们使用从左到右的阅读方式。尝试在此处使用从右到左的阅读方式会令人费解,例如“在x 中查找y 值,您是否使用匹配项覆盖了每个x 值?” em>

【讨论】:

  • flights 是来自nycflights13 包的数据集。
【解决方案2】:

这实际上是一个非常好的问题。想想这里的字面性质:

  • 答案是肯定的?
  • 答案是否定的?
  • 答案是肯定的还是否定的?
  • 答案是肯定的还是否定的?

当您使用%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...

【讨论】:

  • 我认为在阅读中使用“任何”是令人困惑的。 “y中有x吗?”有一个是/否的答案。 @GregorThomas 的“对于每个 x,它在 y 中吗?”有与 x 的元素一样多的答案,这与 %in% 所做的匹配。
【解决方案3】:

我认为您的脱节在于了解如何将“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),但最好不要将它们视为完全相同。您不是明确地将xy 中的每个值进行比较,而是在问“x 是否等于y 中的值之一?”就像说“请关灯”和说“请走到墙上的那个盘子上,把上面的小棍子往下拉”一样。它表达了你想要什么,而不是如何弄清楚,这让你的代码更具可读性,而且代码被阅读的次数比编写的次数多,所以这很重要!!!

现在我要离开我的领域了——再说一次,我不知道 R 在这里实际上做了什么——但回答问题的基本方法也可能不同。它可能使用binary search 算法来确定x 是否在y 中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-16
    • 2019-09-25
    • 2012-09-02
    相关资源
    最近更新 更多