2010-05-10 18 views
46

Sé que he encontrado este problema antes, pero estoy teniendo un bloqueo mental en este momento. y como no puedo encontrarlo en SO, lo publicaré aquí para poder encontrarlo la próxima vez.Cómo obtener el segundo elemento secundario de cada elemento en una lista

Tengo un marco de datos que contiene un campo que representa una etiqueta de identificación. Esta etiqueta tiene dos partes, un prefijo alfa y un sufijo numérico. Quiero dividir aparte y crear dos nuevos campos con estos valores en.

structure(list(lab = c("N00", "N01", "N02", "B00", "B01", "B02", 
"Z21", "BA01", "NA03")), .Names = "lab", row.names = c(NA, -9L 
), class = "data.frame") 

df$pre<-strsplit(df$lab, "[0-9]+") 
df$suf<-strsplit(df$lab, "[A-Z]+") 

que da

lab pre suf 
1 N00 N , 00 
2 N01 N , 01 
3 N02 N , 02 
4 B00 B , 00 
5 B01 B , 01 
6 B02 B , 02 
7 Z21 Z , 21 
8 BA01 BA , 01 
9 NA03 NA , 03 

Así, la primera strsplit funciona bien, pero la segunda da una lista , cada uno con dos elementos, una cadena vacía y el resultado que quiero, y los coloca a ambos en la columna del marco de datos.

¿Cómo puedo seleccionar el segundo subelemento de cada elemento de la lista? (O, hay una mejor manera de hacer esto)

Respuesta

82

Para seleccionar el segundo elemento de cada elemento de la lista:

R> sapply(df$suf, "[[", 2) 
[1] "00" "01" "02" "00" "01" "02" "21" "01" "03" 

Un enfoque alternativo usando expresiones regulares:

df$pre <- sub("^([A-Z]+)[0-9]+", "\\1", df$lab) 
df$suf <- sub("^[A-Z]+([0-9]+)", "\\1", df$lab) 
+0

lo que es el ' "[["' haciendo en este ejemplo? – user5359531

+0

selecciona elementos individuales de los elementos de la lista, ¿ves? "[[" – rcs

4

En primer lugar : si utiliza str(df), verá que df$pre es list. Creo que quieres vector (pero podría estar equivocado).
Volver al problema - en este caso voy a utilizar gsub:

df$pre <- gsub("[0-9]", "", df$lab) 
df$suf <- gsub("[A-Z]", "", df$lab) 

Esta garantía de que ambas columnas son los vectores, pero fallan si su etiqueta no es de llave (es decir 'AB01B').

+0

Respuesta de RCS en realidad responde mi pregunta principal (cómo devolver el segundo valor de la lista) pero tu respuesta parece ser más elegante para lo que realmente quiero. Bien hecho. – PaulHurleyuk

+1

Podría explicar cómo funcionaba el "[[" en sapply. La definición de sapply se encuentra en: http://www.inside-r.org/r-doc/base/sapply. – and0rsk

Cuestiones relacionadas