Pregunta

Estoy tratando de dividir una cadena en "". y crear columnas adicionales con las dos cadenas antes y después "".

tes<-c("1.abc","2.di","3.lik")
dat<-c(5,3,2)
h<-data.frame(tes,dat)
h$num<-substr(h$tes,1,1)

h$prim<-unlist(strsplit(as.character(h$tes),"\\."))[2]
h$prim<-sapply(h$tes,unlist(strsplit(as.character(h$tes),"\\."))[2])

Me gustaría h$prim para contener "abc", "di", "lik" .. Sin embargo no soy capaz de entenderlo. Supongo strsplit no está vectorizada, pero luego pensé que la versión sapply debería haber funcionado. Sin embargo supongo que debe ser fácil: -)

Saludos, // M

¿Fue útil?

Solución

Esto debería hacer el truco

R> sapply(strsplit(as.character(h$tes), "\\."), "[[", 2)
[1] "abc" "di"  "lik"

Otros consejos

Con el paquete stringr es aún más fácil:

library(stringr)
str_split_fixed(h$tes, fixed("."), 2)[, 2]

Esta es la misma que la respuesta de RCS, pero puede ser más fácil de entender:

> sapply(strsplit(as.character(h$tes), "\\."), function(x) x[[2]])
[1] "abc" "di"  "lik"

Esta pregunta aparece varias veces en StackOverflow.

En forma exacta como la suya:

Algunos pregunta similar en este tema:

Y si se preocupan por la velocidad, entonces debería considerar fixed parámetro para strsplit .

Como alternativa, puede ahorrarse el trabajo de sacar el segundo elemento si se agrega ambas columnas al mismo tiempo:

tes <- c("1.abc","2.di","3.lik")
dat <- c(5,3,2)
h <- data.frame(tes, dat, stringsAsFactors=FALSE)
values <- unlist(strsplit(h$tes, ".", fixed=TRUE))
h <- cbind(h, matrix(values, byrow=TRUE, ncol=2,
                     dimnames=list(NULL, c("num", "prim"))))
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top