Tengo esta muestra:

example <- data.frame(data=c("Annie;7;3%;Luciana;9;2%;Lucas;1;10%"))

Y necesito separarlo para que cada nombre tenga la información adecuada en la misma columna. Además, no sé cuánto duran los "datos", así que creé un vector largo con nombres

names<- paste0("name ",1:70,"")

Y separé el ejemplo así:

example <- example %>% separate(data,into=c(names),sep="(%;[A-z])")

De esta manera, puedo separar todos los casos, pero me falta el primer y el último carácter (el único que le importa es el primero):

Annie;7;3 | uciana;9;2 | ucas;1;10%

¿Hay alguna forma de dividir la información sin perder el primer personaje? No soy bueno con regex.

¡Gracias!

1
Ivan Cereghetti 24 jun. 2020 a las 06:08

3 respuestas

La mejor respuesta

La solución más inmediata a su problema es con una afirmación anticipada positiva. Esto significa que la división se producirá en el separador, pero no incluirá el grupo de captura positiva de anticipación. La búsqueda anticipada positiva se denota con (?=).

library(dplyr)
library(tidyr)
example %>% 
   separate(data, into=c(names), sep="%;(?=[A-z])")
1
Ian Campbell 24 jun. 2020 a las 03:16

Una opción básica de R sería utilizar strsplit combinar con do.call:

example <- data.frame(data=c("Annie;7;3%;Luciana;9;2%;Lucas;1;10%"))
out <- strsplit(as.character(example$data), '(?<=%);', perl=TRUE) 
data.frame(do.call(rbind, out))

          X1           X2          X3
1 Annie;7;3% Luciana;9;2% Lucas;1;10%
1
Tim Biegeleisen 24 jun. 2020 a las 03:14
read.csv(header = FALSE, text = gsub("%;", "%,", example$data), stringsAsFactors = FALSE)
#          V1           V2          V3
#1 Annie;7;3% Luciana;9;2% Lucas;1;10%
0
d.b 24 jun. 2020 a las 04:18