es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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"))
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para combinar columnas con un número variable de delimitadores, podemos usar la función split para separar las cadenas en dt1 por su delimitador (en este caso, el signo +), y luego usar la función merge para hacer coincidir las subcadenas resultantes con sus valores correspondientes en dt2. Finalmente, podemos usar la función paste para combinar los valores de la columna number en una sola cadena para cada fila, y asignarla a la columna number en output. 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, llamada sub_letter, que contiene una lista de subcadenas obtenidas al dividir cada cadena en la columna letter por el delimitador +. Usamos la función unnest del paquete tidyr 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 y dt2 en las columnas letter y sub_letter, respectivamente. Esto agregará una columna number a dt1 que contiene los valores coincidentes de dt2.

    Finalmente, agrupamos dt1 por la columna letter y usamos la función paste para combinar los valores de la columna number en una sola cadena con + como separador. El marco de datos resultante se almacena en output.

Comments are closed.