2010-01-23 10 views
10

Ho un frame di dati con circa 40 colonne, la seconda colonna, dati [2] contiene il nome della società che il resto dei dati di riga descritto. Tuttavia, i nomi delle società sono diversi a seconda dell'anno (ultimi 09 per i dati del 2009, nulla per il 2010).sottoinsiemi in R utilizzando condizione OR con stringhe

mi piacerebbe essere in grado di sottoinsiemi i dati in modo tale che posso tirare in entrambi gli anni in una sola volta. Ecco un esempio di quello che sto cercando di fare ...

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

In sostanza, sto avendo difficoltà a utilizzare l'operatore OR all'interno della funzione sottoinsieme.

Tuttavia, ho provato altre alternative:

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

Forse c'è un modo più semplice per farlo utilizzando una funzione di stringa?

Ogni pensiero sarebbe appreicated.

+3

Intendevi sottoinsieme (dati, dati [, 2] == "Nome azienda 09" | dati [, 2] == "Nome azienda", drop = T) –

+0

Sintassi, il mio peggior nemico. Grazie Jonathan. Questo è esattamente quello che stavo cercando di fare. –

risposta

14

Prima di tutto (come ha fatto Jonathan nel suo commento) per fare riferimento alla seconda colonna, è necessario utilizzare data[[2]] o data[,2]. Ma se si utilizza sottoinsieme si potrebbe utilizzare il nome della colonna: subset(data, CompanyName == ...).

E per mettere in discussione 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) 

Al secondo io uso grepl (introdotta con R versione 2.9) che restituiscono vettore logica con TRUE per partita.

+0

Grazie Marek, la seconda soluzione è molto più pulito e semplifica il codice. grepl non è nei miei documenti quando eseguo una ricerca su stringa. –

+0

Mille grazie mille Marek, non sapeva nemmeno che il sottoinsieme accetta% in%. Ciò consente di risparmiare un sacco di digitazione macchinosa/soggetta a errori con le clausole OR. +1 !! la mia risposta della settimana finora! –

+1

Cosa succede se il nome della colonna ha uno spazio? ad esempio "Nome azienda". Possiamo ancora usare il sottoinsieme – RockScience

5

Un paio di cose:

1) Dati Mock-up è utile come non sappiamo esattamente cosa si sta di fronte a. Si prega di fornire i dati, se possibile. Forse ho frainteso in ciò che segue?

2) Non usare [[2]] per indicizzare il tuo data.frame, credo [ "colname"] è molto più chiaro

3) Se l'unica differenza è una finale '09' nel nome, poi semplicemente regexp che fuori:

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

Ora si dovrebbe essere in grado di fare la tua sottoinsieme sui dati trasformati 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> 

si potrebbe anche avere sostituire la colonna nome con regexp'ed va lue.

+0

Jonathan mi ha dato la risposta che cercavo in un commento sopra. Ma il tuo post risolve un altro problema simile che stavo avendo. Grazie Dirk. –

+0

Piacere mio - contento che abbia aiutato. –

Problemi correlati