Agrégation par identifiant unique et concaténation des valeurs associées dans une chaîne

J’imagine qu’un besoin pourrait être satisfait par aggregate ou reshape , mais je ne peux pas vraiment comprendre.

J’ai une liste de noms ( brand ) et un numéro d’identification ( id ). Ces données sont longues, les noms peuvent donc avoir plusieurs identifiants. Je voudrais dédoubler par le nom ( brand ) et concaténer les multiples id possibles dans une chaîne séparée par un commentaire.

Par exemple:

 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 

devraient devenir:

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

Comment pourrais-je accomplir cela?

Appelons vos data.frame DF

 > 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 

Une autre alternative utilisant l’ aggregate est:

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

Cela produit le même résultat et maintenant id n’est plus une list . Merci à @Frank commentaire. Pour voir la class de chaque colonne, essayez:

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

Comme mentionné par @DavidArenburg dans les commentaires, une autre alternative utilise la fonction toSsortingng :

 aggregate(id ~ brand, data = DF, toSsortingng) 

Une belle ligne propre dans data.table

 library(data.table) setDT(DF) 

DEUX OPTIONS:

résultats sous forme de liste

 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 > 

résultats sous forme de chaîne

 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 

Remarque

Même si les deux résultats semblent identiques (c’est-à-dire lorsque vous les imprimez, ils paraissent identiques), ils sont en fait très différents et permettent des fonctionnalités différentes.

À savoir, l’utilisation de l’option de liste (la première) vous permet d’effectuer des fonctions sur les id .

Ce dernier vous permettra d’afficher plus facilement les informations (y compris d’exporter au CSV ou excel ), mais opérer sur les id nécessitera leur épissage.

Ou en utilisant dplyr :

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

DF est le nom de votre data.frame.

Voici les informations dans la base R:

 myby <- by(df$id,df$brand,function(x)paste(x,collapse=",")) 

Le formatage des objects "by" est étrange. Vous pouvez prendre data.frame(id=c(myby)) et les marques deviendront des noms de marques:

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

Sinon, si vous chargez le package data.table , cela fonctionnera:

 dt <- data.table(df) dt[,paste(id,collapse=","),by=brand] # brand V1 # 1: RadioShack 2308 # 2: Rag & Bone 4466 # 3: Ragu 1830,4518 # 4: Ralph Lauren 1638,2719,2720,2721,2722