2010-11-18 34 views
24

chciałbym wybrać wiersze oparte na podzbiorów ich nazwami, na przykładJak mam grep w R?

Jeśli mam następujące dane:

data <- structure(c(91, 92, 108, 104, 87, 91, 91, 97, 81, 98), 
.Names = c("fee-", "fi", "fo-", "fum-", "foo-", "foo1234-", "123foo-", 
"fum-", "fum-", "fum-")) 

jak mam wybrać wiersze dopasowanie „foo”?

używając grep() nie działa:

grep('foo', data) 

Powroty:

integer(0) 

co robię źle? Czy jest jakiś lepszy sposób?

Dzięki!

Odpowiedz

27

Musisz odwołać się do właściwości names danych, a nie do właściwości value.

Dla przykładu, użyj

> grep("foo",names(data)) 
[1] 5 6 7 
> data[grep("foo",names(data))] 
    foo- foo1234- 123foo- 
    87  91  91 

jeden inny czysty sposób to zrobić jest użycie ramek danych.

> data <- data.frame(values=c(91, 92, 108, 104, 87, 91, 91, 97, 81, 98), 
        names = c("fee-", "fi", "fo-", "fum-", "foo-", "foo1234-", "123foo-", 
        "fum-", "fum-", "fum-")) 

> data$values[grep("foo",data$names)] 
[1] 87 91 91 
6

Użyj podzbiór w połączeniu z wyrażeń regularnych:

subset(your_data, regexpr("foo", your_data$your_column_to_match) > 0)) 

Jeśli tylko dbają o zbiorze danych z jednej kolumny Chyba nie trzeba podać nazwę kolumny ...

Philip

+6

Zwykle uważam, że 'grepl' jest bardziej użyteczny - można pominąć porównanie względem 0, co sprawia, że ​​kod wygląda trochę czystszy. – Harlan

2
> grep("foo",names(data), value=T) 
[1] "foo-"  "foo1234-" "123foo-" 

jeśli wartość jest prawdą, zwraca treść zamiast indeksu