3 回答

TA貢獻1811條經(jīng)驗 獲得超4個贊
你需要%in%而不是==:
library(dplyr)
target <- c("Tom", "Lynn")
filter(dat, name %in% target) # equivalently, dat %>% filter(name %in% target)
產(chǎn)生
days name
1 88 Lynn
2 11 Tom
3 1 Tom
4 222 Lynn
5 2 Lynn
要了解原因,請考慮這里發(fā)生的事情:
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
在這種情況下,我們不會收到錯誤,因為我懷疑您的數(shù)據(jù)框?qū)嶋H上有不同數(shù)量的行不允許回收,但您提供的示例(8行)。如果樣本有一個奇數(shù)行,我會得到與你相同的錯誤。但即使回收工作,這顯然不是你想要的?;旧?,該陳述dat$name == target相當(dāng)于說:
返回TRUE等于“Tom”的每個奇數(shù)值或等于“Lynn”的每個偶數(shù)值。
碰巧的是,樣本數(shù)據(jù)框中的最后一個值是偶數(shù)并且等于“Lynn”,因此TRUE上面的那個值。
相比之下,dat$name %in% target說:
對于每個值dat$name,檢查它是否存在于target。
非常不一樣。結(jié)果如下:
[1] TRUE TRUE FALSE FALSE FALSE TRUE TRUE TRUE
注意你的問題與之無關(guān)dplyr,只是誤用了==。

TA貢獻1798條經(jīng)驗 獲得超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 關(guān)注
- 831 瀏覽
添加回答
舉報