2013-01-23 74 views
10

我期待着做一些看似非常簡單的事情。我想在幾個不同的短語中使用grepl()命令或類似的東西在R中對數據框進行子集化,而不構建循環。基於使用grepl()的字符串列表的子集?

例如,我想退出時,所有的行,任何人名爲鮑勃或瑪麗:

## example data frame: 
tmp = structure(list(Name = structure(c(6L, 8L, 9L, 7L, 2L, 3L, 10L, 
1L, 5L, 4L), .Label = c("Alan", "Bob", "bob smith", "Frank", 
"John", "Mary Anne", "mary jane", "Mary Smith", "Potter, Mary", 
"smith, BOB"), class = "factor"), Age = c(31L, 23L, 23L, 55L, 
32L, 36L, 45L, 12L, 43L, 46L), Height = 1:10), .Names = c("Name", 
"Age", "Height"), class = "data.frame", row.names = c(NA, -10L 
)) 

tmp 

#   Name Age Height 
#1  Mary Anne 31  1 
#2 Mary Smith 23  2 
#3 Potter, Mary 23  3 
#4  mary jane 55  4 
#5   Bob 32  5 
#6  bob smith 36  6 
#7 smith, BOB 45  7 
#8   Alan 12  8 
#9   John 43  9 
#10  Frank 46  10 

## this doesn't work 
mynames=c('bob','mary') 
tmp[grepl(mynames,tmp$Name,ignore.case=T),] 

任何想法將是有益的!

+0

您應該在控制檯中發出警告,因爲'grep'系列函數需要指定模式(固定字符串或正則表達式)的單個字符串。 '?grep'中的文檔聲明:「如果提供了長度爲2或更長的字符向量,則第一個元素將與警告一起使用。」 –

回答

26

您可以將您的mynames矢量與正則表達式運算符|結合使用並使用grep

tmp[grep(paste(mynames, collapse='|'), tmp$Name, ignore.case=TRUE),] 

#   Name Age Height 
# 1 Mary Anne 31  1 
# 2 Mary Smith 23  2 
# 3 Potter, Mary 23  3 
# 4 mary jane 55  4 
# 5   Bob 32  5 
# 6 bob smith 36  6 
# 7 smith, BOB 45  7 
+4

@Justin這裏'|',不是邏輯或,但是正則表達式替代運算符(即'paste(mynames,collapse =「&」)'不會做你期望的) – hadley

+0

@hadley你是對的!我會相應地編輯。 – Justin

相關問題