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
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:
- selección primer elemento de
strsplit
- Selección segundo elemento separado por espacio
- Selección segundo elemento separado por punto recomiendo esta pregunta para ver de cuántas maneras se podría lograr.
Algunos pregunta similar en este tema:
- Split sin separador
- Sobre la primera parte como en su pregunta, pero fue el cambio de caso más complejo
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"))))