Agregar por identificador único y concatenar valores relacionados en una cadena [duplicado]

Resuelto roody asked hace 54 años • 4 respuestas

Tengo una necesidad que imagino que podría ser satisfecha con aggregateo reshape, pero no logro entenderla.

Tengo una lista de nombres ( brand) y el número de identificación que la acompaña ( id). Estos datos están en formato largo, por lo que los nombres pueden tener múltiples ID. Me gustaría eliminar los duplicados por el nombre ( brand) y concatenar los múltiples posibles iden una cadena separada por un comentario.

Por ejemplo:

brand            id 
RadioShack       2308
Rag & Bone       4466
Ragu             1830
Ragu             4518
Ralph Lauren     1638
Ralph Lauren     2719
Ralph Lauren     2720
Ralph Lauren     2721
Ralph Lauren     2722 

debe convertirse:

RadioShack       2308
Rag & Bone       4466
Ragu             1830,4518
Ralph Lauren     1638,2719,2720,2721,2722

¿Cómo lograría esto?

roody avatar Jan 01 '70 08:01 roody
Aceptado

Llamemos a tu data.frameDF

> aggregate(id ~ brand, data = DF, c)
         brand                           id
1   RadioShack                         2308
2   Rag & Bone                         4466
3         Ragu                   1830, 4518
4 Ralph Lauren 1638, 2719, 2720, 2721, 2722

Otro uso alternativo aggregatees:

result <- aggregate(id ~ brand, data = DF, paste, collapse = ",")

Esto produce el mismo resultado y ya idno es listasí. Gracias al comentario de @Frank. Para ver el classde cada columna intente:

> sapply(result, class)
      brand          id 
   "factor" "character"

Como menciona @DavidArenburg en los comentarios, otra alternativa es usar la toStringfunción:

aggregate(id ~ brand, data = DF, toString)
Jilber Urbina avatar May 16 '2013 20:05 Jilber Urbina

Una línea bonita y limpiadata.table

library(data.table)
setDT(DF)

DOS OPCIONES:

resultados como una lista

DF[ , .(id = list(id)), by = brand]
          brand                       id
1:   RadioShack                     2308
2:   Rag & Bone                     4466
3:         Ragu                1830,4518
4: Ralph Lauren 1638,2719,2720,2721,2722
> 

resultados como una cadena

DF[ , .(id = paste(id, collapse=",")), by = brand]
          brand                       id
1:   RadioShack                     2308
2:   Rag & Bone                     4466
3:         Ragu                1830,4518
4: Ralph Lauren 1638,2719,2720,2721,2722

Nota

Aunque los dos resultados parecen iguales (es decir, cuando los imprime, parecen idénticos), en realidad son muy diferentes y permiten diferentes funciones.

Es decir, usar la opción de lista (la primera) le permite luego realizar funciones en los originales id.

Este último le permitirá mostrar la información más fácilmente (incluida la exportación a CSVo excel), pero para operar con los id's será necesario volver a unirlos.

Ricardo Saporta avatar May 16 '2013 21:05 Ricardo Saporta

O usando dplyr :

library(dplyr)
DF %>%
  group_by(brand) %>%
  summarise(id = paste(id, collapse = ","))

¿ Dónde DFestá el nombre de su marco de datos?

Sam Firke avatar May 22 '2015 12:05 Sam Firke