2013-01-23 9 views
10

Sto cercando di fare qualcosa apparentemente molto semplice. Vorrei inserire un frame dati in R usando il comando grepl() - o qualcosa di simile - su diverse frasi senza costruire un ciclo.Sottoinsieme basato sull'elenco di stringhe che utilizzano grepl()?

Per esempio, mi piacerebbe tirare fuori tutte le righe per chiunque di nome Bob o Maria:

## 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),] 

Tutte le idee sarebbe utile!

+0

si dovrebbe essere sempre un avvertimento nella console perché il 'famiglia grep' di funzioni richiede una stringa di caratteri singolo che specifica il modello (o una stringa fissa o un'espressione regolare). La documentazione in '? Grep' afferma," Se viene fornito un vettore di caratteri di lunghezza 2 o più, il primo elemento viene utilizzato con un avvertimento. " –

risposta

26

È possibile combinare il vettore mynames con l'operatore di espressione regolare | e utilizzare 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 qui '|', non è un logico, ma l'operatore regexp alternativo (ad esempio 'paste (mynames, collapse =" & ")' non farebbe quello che ci si potrebbe aspettare) – hadley

+0

@hadley Hai ragione! Modificherò di conseguenza. – Justin

Problemi correlati