Sottolineare in r usando o condizione con stringhe
Domanda
Ho un frame di dati con circa 40 colonne, la seconda colonna, dati [2] contiene il nome dell'azienda che il resto dei dati di riga descrive. Tuttavia, i nomi delle società sono diversi a seconda dell'anno (trascinando 09 per i dati del 2009, nulla per il 2010).
Vorrei essere in grado di sottolineare i dati in modo tale da poter tirare in entrambi gli anni contemporaneamente. Ecco un esempio di quello che sto cercando di fare ...
subset(data, data[2] == "Company Name 09" | "Company Name", drop = T)
In sostanza, ho difficoltà a usare l'operatore all'interno della funzione del sottoinsieme.
Tuttavia, ho provato altre alternative:
subset(data, data[[2]] == grep("Company Name", data[[2]]))
Forse c'è un modo più semplice per farlo usando una funzione di stringa?
Qualsiasi pensiero verrebbe apprezzato.
Soluzione
Prima di tutto (come Jonathan ha fatto nel suo commento) per fare riferimento alla seconda colonna che dovresti usare data[[2]]
o data[,2]
. Ma se si utilizza il sottoinsieme è possibile utilizzare il nome della colonna: subset(data, CompanyName == ...)
.
E per la tua domanda farò uno di:
subset(data, data[[2]] %in% c("Company Name 09", "Company Name"), drop = TRUE)
subset(data, grepl("^Company Name", data[[2]]), drop = TRUE)
In secondo luogo uso grepl
(introdotto con R versione 2.9) che restituiscono il vettore logico con TRUE
per la partita.
Altri suggerimenti
Un paio di cose:
1) I dati del mock-up sono utili in quanto non sappiamo esattamente cosa ti trovi di fronte. Si prega di fornire dati se possibile. Forse sono stato frainteso in ciò che segue?
2) Non usare [[2]]
Per indicizzare il tuo data.rame, penso che [, "colname"] sia molto più chiaro
3) Se l'unica differenza è un trailing '09' nel nome, allora regali semplicemente:
R> x1 <- c("foo 09", "bar", "bar 09", "foo")
R> x2 <- gsub(" 09$", "", x1)
[1] "foo" "bar" "bar" "foo"
R>
Ora dovresti essere in grado di eseguire il tuo sottoinsieme sui dati trasformati al volo:
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>
È inoltre possibile sostituire la colonna Nome con il valore di Regexp'ed.