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)
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
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 = ","))
Où 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