Combinar columnas con múltiples delimitadores.
¿Cómo puedo combinar columnas con un número variable de delimitadores para poder obtener algo similar a la salida (asumiendo que todo es un carácter)?
dt1
letra
1 a
2 b+c
3 c
4 d+e+f+g
5 a+g+e
dt2
letra número
1 a 1
2 b 2
3 c 3
4 d 4
5 e 5
6 f 6
7 g 7
> salida
letra número
1 a 1
2 b+c 2+3
3 c 3
4 d+e+f+g 4+5+6+7
5 a+g+e 1+7+5
dt1<-data.frame(letra=c("a","b+c","c","d+e+f+g","a+g+e"))
dt2<-data.frame(letra=c("a","b","c","d","e","f","g"),number=c("1","2","3","4","5","6","7"))
salida<-data.frame(letra=c("a","b+c","c","d+e+f+g","a+g+e"), number=c("1","2+3","3","4+5+6+7","1+7+5"))
davy.ai
Para combinar columnas con un número variable de delimitadores, podemos usar la función
split
para separar las cadenas endt1
por su delimitador (en este caso, el signo+
), y luego usar la funciónmerge
para hacer coincidir las subcadenas resultantes con sus valores correspondientes endt2
. Finalmente, podemos usar la funciónpaste
para combinar los valores de la columnanumber
en una sola cadena para cada fila, y asignarla a la columnanumber
enoutput
. Aquí está el código:“`{r}
library(dplyr)
dt1 <- data.frame(letter = c(“a”, “b+c”, “c”, “d+e+f+g”, “a+g+e”))
dt2 <- data.frame(letter = c(“a”, “b”, “c”, “d”, “e”, “f”, “g”),
number = 1:7)
dt1 <- dt1 %>%
mutate(sub_letter = strsplit(as.character(letter), “[+]”))
output <- dt1 %>%
unnest(sub_letter) %>%
left_join(dt2, by = c(“sub_letter” = “letter”)) %>%
group_by(letter) %>%
summarise(number = paste(number, collapse = “+”))
“`
En el código de arriba, primero creamos una nueva columna en
dt1
, llamadasub_letter
, que contiene una lista de subcadenas obtenidas al dividir cada cadena en la columnaletter
por el delimitador+
. Usamos la funciónunnest
del paquetetidyr
para convertir esta columna de listas en múltiples filas, cada una conteniendo una sola subcadena.Luego, realizamos una unión izquierda entre este nuevo
dt1
ydt2
en las columnasletter
ysub_letter
, respectivamente. Esto agregará una columnanumber
adt1
que contiene los valores coincidentes dedt2
.Finalmente, agrupamos
dt1
por la columnaletter
y usamos la funciónpaste
para combinar los valores de la columnanumber
en una sola cadena con+
como separador. El marco de datos resultante se almacena enoutput
.