【问题标题】:How to use '%in%' operator in R?如何在 R 中使用 '%in%' 运算符?
【发布时间】:2022-01-01 22:52:03
【问题描述】:

自从知道%in%运算符以来,我已经使用了很长时间了。

但是,我仍然不明白它是如何工作的。至少,我以为我知道怎么做,但我总是怀疑元素的顺序。

这里有一个例子:

这是我的数据框:

df <- data.frame("col1"=c(1,2,3,4,30,21,320,123,4351,1234,3,0,43), "col2"=rep("something",13))

这个样子

> df
   col1      col2
1     1 something
2     2 something
3     3 something
4     4 something
5    30 something
6    21 something
7   320 something
8   123 something
9  4351 something
10 1234 something
11    3 something
12    0 something
13   43 something

假设我有一个数值向量:

myvector <- c(30,43,12,333334,14,4351,0,5,55,66)

我想检查我的向量中的所有数字(或一些数字)是否都在前一个数据框中。为此,我总是使用%in%

我想到了两种方法:

#common in both: 30, 4351, 0, 43

# are the numbers from df$col1 in my vector?

    trial1 <- subset(df, df$col1 %in% myvector)

# are the numbers of the vector in df$col1?

    trial2 <- subset(df, myvector %in% df$col1)

这两种方法对我来说都有意义,它们应该给出相同的结果。但是,只有 trial1 的结果是可以的。

> trial1
   col1      col2
5    30 something
9  4351 something
12    0 something
13   43 something

我不明白为什么第二种方法是给我一些常见的数字和一些不在向量中的数字。

 col1      col2
1     1 something
2     2 something
6    21 something
7   320 something
11    3 something
12    0 something

有人可以向我解释一下 `%in% 运算符是如何工作的,为什么第二种方式会给我错误的结果吗?

提前非常感谢

问候

【问题讨论】:

  • %in% 返回一个逻辑向量,指示其 left 操作数是否匹配。
  • 第一种方法是正确的,当我们使用“in”时,它会创建与输入大小相同的逻辑向量。然后根据它对数据进行子集化。第二种方法是给出无意义的子集,因为长度不匹配并且它会回收。
  • 试验 2 是错误的,因为您是根据向量分量的位置对 df 进行子集化(并且从文档中“缺失值被视为假”)。
  • 关键是 回收 不同长度的输出,如 Merijn 的回答所示。应该始终小心地将输出的长度与帧中的行数对齐; myvector %in% df$col1 将始终返回与 length(myvector) 相同长度的向量,而不管 nrow(df),这意味着 that 返回值对于子集 df 是不安全的。

标签: r operators subset


【解决方案1】:

给出了答案,但更详细一点,只需查看 %in% 结果

df$col1 %in% myvector
# [1] FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE  TRUE FALSE FALSE  TRUE  TRUE

当您对 df 进行子集化并保留 TRUE 值时,上述一个是正确的,第 5、9、12、13 行

myvector %in% df$col1
# [1]  TRUE  TRUE FALSE FALSE FALSE  TRUE  TRUE FALSE FALSE FALSE

当您对 df 进行子集化并告诉保留 1、2、6、7 并且此处的长度仅为 10 时,这会出错,它会将 11、12、13 再次循环为 TRUE、TRUE、FALSE,因此您会得到 11 和 12你的子集也是如此

【讨论】:

    猜你喜欢
    • 2012-05-10
    • 1970-01-01
    • 1970-01-01
    • 2018-09-16
    • 1970-01-01
    • 2020-09-22
    • 2019-08-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多