2010-01-23 9 views
10

Tengo un marco de datos con aproximadamente 40 columnas, la segunda columna, datos [2] contiene el nombre de la compañía que describe el resto de los datos de la fila. Sin embargo, los nombres de las compañías son diferentes según el año (detrás de 09 para 2009, nada para 2010).Subconjunto en R usando la condición O con cadenas

Me gustaría poder subconjuntar los datos de modo que pueda obtener ambos años a la vez. He aquí un ejemplo de lo que estoy tratando de hacer ...

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

Esencialmente, estoy teniendo dificultades para utilizar el operador OR dentro de la función de subconjuntos.

Sin embargo, he probado otras alternativas:

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

tal vez hay una manera más fácil de hacerlo utilizando una función de cadena?

Cualquier pensamiento sería apreciado.

+3

Quizás quiso decir subconjunto (datos, datos [, 2] == "Nombre de la empresa 09" | data [, 2] == "Nombre de la empresa", drop = T) –

+0

Sintaxis, mi peor enemigo. Gracias Jonathan. Eso es exactamente lo que estaba tratando de hacer. –

Respuesta

14

En primer lugar (como lo hizo Jonathan en su comentario) para hacer referencia a la segunda columna debe usar data[[2]] o data[,2]. Pero si está utilizando subconjunto podría usar el nombre de la columna: subset(data, CompanyName == ...).

Y para usted pregunta que voy a hacer uno de:

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

En segundo utilizo grepl (introducido con R versión 2.9) que devuelven vector lógico con TRUE el inicio del partido.

+0

Gracias Marek, la segunda solución es mucho más limpia y simplifica el código. grepl no está en mis documentos cuando busco ?? string. –

+0

Hilarante muchas gracias Marek, ni siquiera sabía que el subconjunto acepta '% en%'. Esto ahorra una gran cantidad de tipeo engorroso/propenso a errores con cláusulas OR. +1 !! mi respuesta de la semana hasta el momento! –

+1

¿Qué sucede si el nombre de la columna tiene un espacio? por ejemplo, "Nombre de la compañía". ¿Todavía podemos usar el subconjunto – RockScience

5

Un par de cosas:

1) datos Mock-up es útil, ya que no se sabe exactamente lo que está frente a. Proporcione datos si es posible. ¿Tal vez no entendí lo que sigue?

2) No utilice [[2]] para indexar su hoja.de.datos, creo [ "nomCol"] es mucho más clara

3) Si la única diferencia es un terminador '09' en el nombre, a continuación, simplemente expresión regular que fuera:

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

Ahora usted debería ser capaz de hacer su subconjunto de los datos transformados en la marcha:

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> 

también podría tener sustituir la columna de nombre con regexp'ed Virginia lue.

+0

Jonathan me dio la respuesta que estaba buscando en un comentario anterior. Pero tu publicación resuelve otro problema similar que estaba teniendo. Gracias Dirk. –

+0

Fue un placer, me alegro de que haya ayudado. –