3 回答
TA贡献1811条经验 获得超4个赞
你需要%in%而不是==:
library(dplyr)
target <- c("Tom", "Lynn")
filter(dat, name %in% target) # equivalently, dat %>% filter(name %in% target)
产生
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相当于说:
返回TRUE等于“Tom”的每个奇数值或等于“Lynn”的每个偶数值。
碰巧的是,样本数据框中的最后一个值是偶数并且等于“Lynn”,因此TRUE上面的那个值。
相比之下,dat$name %in% target说:
对于每个值dat$name,检查它是否存在于target。
非常不一样。结果如下:
[1] TRUE TRUE FALSE FALSE FALSE TRUE TRUE TRUE
注意你的问题与之无关dplyr,只是误用了==。
TA贡献1798条经验 获得超7个赞
使用base包:
df <- data.frame(days = c(88, 11, 2, 5, 22, 1, 222, 2), name = c("Lynn", "Tom", "Chris", "Lisa", "Kyla", "Tom", "Lynn", "Lynn"))
# Three lines
target <- c("Tom", "Lynn")
index <- df$name %in% target
df[index, ]
# One line
df[df$name %in% c("Tom", "Lynn"), ]
输出:
days name
1 88 Lynn
2 11 Tom
6 1 Tom
7 222 Lynn
8 2 Lynn
使用sqldf:
library(sqldf)
# Two alternatives:
sqldf('SELECT *
FROM df
WHERE name = "Tom" OR name = "Lynn"')
sqldf('SELECT *
FROM df
WHERE name IN ("Tom", "Lynn")')
- 3 回答
- 0 关注
- 806 浏览
添加回答
举报