你需要%in%
代替==
:
library(dplyr)
target <- c("Tom", "Lynn")
filter(dat, name %in% target) # equivalently, dat %>% filter(name %in% target)
Produces
days name
1 88 Lynn
2 11 Tom
3 1 Tom
4 222 Lynn
5 2 Lynn
要理解原因,请考虑这里发生的情况:
dat$name == target
# [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE
基本上,我们正在回收两个长度target
向量四次以匹配长度dat$name
。换句话说,我们正在做:
Lynn == Tom
Tom == Lynn
Chris == Tom
Lisa == Lynn
... continue repeating Tom and Lynn until end of data frame
在这种情况下,我们不会收到错误,因为我怀疑您的数据框实际上具有不同数量的行,不允许回收,但您提供的示例允许回收(8 行)。如果样本的行数为奇数,我会得到与您相同的错误。但即使回收有效,这显然也不是您想要的。基本上,声明dat$name == target
相当于说:
return TRUE
对于等于“Tom”的每个奇数值或等于“Lynn”的每个偶数值。
碰巧样本数据框中的最后一个值是偶数并且等于“Lynn”,因此TRUE
above.
相比之下,dat$name %in% target
says:
对于每个值dat$name
,检查它是否存在于target
.
非常不一样。结果如下:
[1] TRUE TRUE FALSE FALSE FALSE TRUE TRUE TRUE
请注意您的问题与以下内容无关dplyr
,只是误用==
.