2014-09-03 151 views
35

我有一個data.frame字符數據在其中一列中。 我想過濾來自同一列的data.frame中的多個選項。有沒有簡單的方法來做到這一點,我失蹤了?過濾多個條件dplyr

實施例: data.frame名稱= dat

days  name 
88  Lynn 
11   Tom 
2   Chris 
5   Lisa 
22  Kyla 
1   Tom 
222  Lynn 
2   Lynn 

我想濾除例如TomLynn
當我做:

target <- c("Tom", "Lynn") 
filt <- filter(dat, name == target) 

我得到這個錯誤:

longer object length is not a multiple of shorter object length 

回答

101

你需要%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相當於說:

return TRUE for every odd value that is equal to "Tom" or every even value that is equal to "Lynn".

恰巧,在您的樣本數據幀中的最後一個值是偶數且等於「琳」,因此一個TRUE以上。

對比,dat$name %in% target說:

for each value in dat$name , check that it exists in target .

很大的不同。下面是結果:

[1] TRUE TRUE FALSE FALSE FALSE TRUE TRUE TRUE 

注意您的問題無關dplyr,只是誤用的==

+0

感謝您的解釋Brodie!真的很感謝這個,臨牀醫生試圖找出R! – 2014-09-03 15:30:38

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")') 
2

這可以使用dplyr包,這是可以在CRAN來實現。實現此目的的簡單方法:

  1. 安裝dplyr包。

  2. library(dplyr) df<- select(filter(dat,name=='tom'| name=='Lynn',c('days','name))

說明:

因此,一旦我們已經下載dplyr,我們創建通過使用這個包兩種不同功能的新的數據幀:

濾芯:第一個參數是數據幀;第二個參數是我們希望它被子集化的條件。結果是隻有我們想要的行的整個數據框架。 select:第一個參數是數據幀;第二個參數是我們想要從中選擇的列的名稱。我們不必使用names()函數,我們甚至不必使用引號。我們只列出列名作爲對象。