2010-01-23 16 views
10

Ich habe einen Datenrahmen mit etwa 40 Spalten, die zweite Spalte, Daten [2] enthält den Namen des Unternehmens, dass der Rest der Zeile Daten beschreibt. Die Namen der Unternehmen unterscheiden sich jedoch je nach Jahr (nach 09 für 2009, nichts nach 2010).Subsetting in R mit OR-Bedingung mit Strings

Ich würde gerne in der Lage sein, die Daten so zu unterteilen, dass ich in beiden Jahren gleichzeitig ziehen kann. Hier ist ein Beispiel dafür, was ich versuche zu tun ...

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

Im Grunde ich habe Schwierigkeiten, die OR-Operator in der Teilmenge Funktion.

Aber ich habe versucht, andere Alternativen:

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

Vielleicht gibt es einen einfacheren Weg, um es mit einer String-Funktion zu tun?

Alle Gedanken würden appelliert werden.

+3

Meinten Sie Teilmenge (Daten, Daten [, 2] == "Firmenname 09" | Daten [, 2] == "Firmenname", drop = T) –

+0

Syntax, mein schlimmster Feind. Danke Jonathan. Genau das habe ich versucht. –

Antwort

14

Zuerst (wie Jonathan in seinem Kommentar getan hat), um die zweite Spalte zu referenzieren, sollten Sie entweder data[[2]] oder data[,2] verwenden. Wenn Sie jedoch eine Teilmenge verwenden, können Sie den Spaltennamen verwenden: subset(data, CompanyName == ...).

Und für Sie mich fragen tun werde eines der folgenden:

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

Auf dem zweiten I grepl verwenden (mit R-Version 2.9 eingeführt), die für die Übereinstimmung mit TRUE logischem Vektor zurück.

+0

Dank Marek, die zweite Lösung ist viel sauberer und vereinfacht den Code. grepl ist nicht in meiner Dokumentation, wenn ich suche? string. –

+0

Hilarious vielen Dank Marek, wusste nicht einmal Teilmenge akzeptiert '% in%'. Dies erspart viel lästiges/fehleranfälliges Tippen mit OR-Klauseln. +1 !! meine Antwort der Woche bisher! –

+1

Was ist, wenn der Spaltenname ein Leerzeichen enthält? zum Beispiel "Firmenname". Können wir noch die Teilmenge – RockScience

5

Ein paar Dinge:

1) Mock-up-Daten sind nützlich, da wir nicht genau wissen, was Sie mit sind konfrontiert. Bitte geben Sie wenn möglich Daten an. Vielleicht habe ich im Folgenden missverstanden?

2) Nicht [[2]] zu indizieren Ihre data.frame verwenden, glaube ich [, „colname“] ist viel klarer

3) Wenn der einzige Unterschied ein nachlauf ist ‚09‘ im Namen, dann dass einfach regexp aus:

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

Jetzt sollten Sie in der Lage sein, Ihre Teilmenge auf den on-the-fly-transformierten Daten zu tun:

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> 

Sie auch den Namen Spalte mit regexp'ed haben könnten ersetzen va lue.

+0

Jonathan gab mir die Antwort, die ich in einem Kommentar oben suchte. Aber deine Post löst ein anderes ähnliches Problem, das ich hatte. Danke Dirk. –

+0

Mein Vergnügen - froh, dass es geholfen hat. –

Verwandte Themen