Pregunta

Tengo un marco de datos con aproximadamente 40 columnas, la segunda columna, los datos [2] contienen el nombre de la compañía que describe el resto de los datos de fila. Sin embargo, los nombres de las compañías son diferentes según el año (siguiendo 09 para los datos de 2009, nada para 2010).

Me gustaría poder subestimar los datos de tal manera que pueda extraer ambos años a la vez. Aquí hay un ejemplo de lo que estoy tratando de hacer ...

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

Esencialmente, tengo dificultades para usar el operador dentro de la función de subconjunto.

Sin embargo, he probado otras alternativas:

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

¿Quizás hay una manera más fácil de hacerlo usando una función de cadena?

Cualquier pensamiento sería apreicionado.

¿Fue útil?

Solución

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

Y para tu pregunta haré 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 uso grepl (introducido con R versión 2.9) que devuelve el vector lógico con TRUE para el partido.

Otros consejos

Un par de cosas:

1) Los datos de maqueta son útiles ya que no sabemos exactamente a qué se enfrenta. Proporcione datos si es posible. ¿Quizás no entendí mal en lo que sigue?

2) No uses [[2]] para indexar su data.frame, creo que [, "colname"] es mucho más claro

3) Si la única diferencia es un '09' final en el nombre, simplemente resegexp eso:

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

Ahora debería poder hacer su subconjunto en los datos transformados sobre 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 haber reemplazado la columna de nombre con el valor de Regexp'ed.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top