2010-01-23 16 views
10

Mam ramkę danych z około 40 kolumnami, druga kolumna, dane [2] zawiera nazwę firmy, którą opisuje pozostałe dane wiersza. Jednak nazwy firm różnią się w zależności od roku (na końcu 2009 r. Dane za 2009 r., Nic na rok 2010).Podział w R przy użyciu warunku LUB ze stringami

Chciałbym móc podzbiór danych tak, że mogę pobrać w obu latach na raz. Oto przykład tego, co próbuję zrobić ...

subset(data, data[2] == "Company Name 09" | "Company Name", drop = T) 

Zasadniczo mam trudności z używaniem operatora OR w ramach funkcji podzbioru.

Jednak próbowałem inne alternatywy:

subset(data, data[[2]] == grep("Company Name", data[[2]])) 

Być może istnieje łatwiejszy sposób to zrobić przy użyciu funkcji ciąg?

Wszelkie myśli zostaną uznane.

+3

Czy chodziło Ci o podzbiór (dane, dane [, 2] == "Nazwa firmy 09" | dane [, 2] == "Nazwa firmy", drop = T) –

+0

Składnia, mój najgorszy wróg. Dzięki Jonathan. Dokładnie to próbowałem zrobić. –

Odpowiedz

14

Po pierwsze (jak Jonathan zrobił w swoim komentarzu), aby odwołać się do drugiej kolumny, należy użyć albo data[[2]] lub data[,2]. Ale jeśli używasz podzbioru, możesz użyć nazwy kolumny: subset(data, CompanyName == ...).

i dla was pytanie zrobię jedną:

subset(data, data[[2]] %in% c("Company Name 09", "Company Name"), drop = TRUE) 
subset(data, grepl("^Company Name", data[[2]]), drop = TRUE) 

W sekundę używam grepl (wprowadzona w wersji 2.9 R), która zwróci logiczną wektor z TRUE do meczu.

+0

Dzięki Marek, drugie rozwiązanie jest o wiele czystsze i upraszcza kod. grepl nie jest w moich dokumentach, kiedy szukam napisu. –

+0

Zabawne dzięki bardzo dużo Marek, nawet nie wiedział, że podzbiór akceptuje '% w%'. Pozwala to zaoszczędzić wiele kłopotliwych/podatnych na błędy typów z klauzulami OR. +1 !! moja odpowiedź na ten tydzień do tej pory! –

+1

Co się stanie, jeśli nazwa kolumny zawiera spację? na przykład "Nazwa firmy". Czy nadal możemy używać podzbioru – RockScience

5

Kilka rzeczy:

1) Mock-up danych jest przydatny, bo nie wiem dokładnie, co masz do czynienia z. Podaj dane, jeśli to możliwe. Może źle zrozumiałem, co dalej?

2) Nie stosować [[2]] do indeksowania data.frame, myślę [ "colname"] jest o wiele jaśniejsze

3) Jeżeli jedyną różnicą jest wleczone '09' w nazwie, a następnie po prostu regexp, że spośród:

R> x1 <- c("foo 09", "bar", "bar 09", "foo") 
R> x2 <- gsub(" 09$", "", x1) 
[1] "foo" "bar" "bar" "foo" 
R> 

teraz powinieneś być w stanie wykonać podzbiór na przekształconej danych on-the-fly:

R> data <- data.frame(value=1:4, name=x1) 
R> subset(data, gsub(" 09$", "", name)=="foo") 
    value name 
1  1 foo 09 
4  4 foo 
R> 

mogłyby mieć również wymienić kolumnę nazwisko z regexp'ed va Lue.

+0

Jonathan dał mi odpowiedź, której szukałem w komentarzu powyżej. Ale twój post rozwiązuje inny podobny problem, jaki miałem. Dzięki, Dirk. –

+0

Moja przyjemność - cieszę się, że pomogło. –

Powiązane problemy