【发布时间】: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是不安全的。