Agregar por identificador único y concatenar valores relacionados en una cadena [duplicado]
Tengo una necesidad que imagino que podría ser satisfecha con aggregate
o 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 id
en 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?
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 aggregate
es:
result <- aggregate(id ~ brand, data = DF, paste, collapse = ",")
Esto produce el mismo resultado y ya id
no es list
así. Gracias al comentario de @Frank. Para ver el class
de cada columna intente:
> sapply(result, class)
brand id
"factor" "character"
Como menciona @DavidArenburg en los comentarios, otra alternativa es usar la toString
función:
aggregate(id ~ brand, data = DF, toString)
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 CSV
o excel
), pero para operar con los id
's será necesario volver a unirlos.
O usando dplyr :
library(dplyr)
DF %>%
group_by(brand) %>%
summarise(id = paste(id, collapse = ","))
¿ Dónde DF
está el nombre de su marco de datos?