Agréger par un identifiant unique et concaténer des valeurs liées dans une chaîne [dupliquer]
cette question a déjà une réponse ici:
j'ai un besoin que j'imagine pourrait être satisfait par aggregate
ou reshape
, mais je ne peux pas tout à fait figure.
j'ai une liste de noms ( brand
) et le numéro D'identification qui l'accompagne ( id
). Ces données sont en forme longue, donc les noms peuvent avoir des ID multiples. Je voudrais dé-dupliquer par le nom ( brand
) et concaténer le multiple possible id
's 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
devrait devenir:
RadioShack 2308
Rag & Bone 4466
Ragu 1830,4518
Ralph Lauren 1638,2719,2720,2721,2722
Comment faire?
4 réponses
appelons vos données.section 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 aggregate
est:
result <- aggregate(id ~ brand, data = DF, paste, collapse = ",")
Cela produit le même résultat et maintenant id
n'est pas un list
plus. Merci au commentaire de @Frank. Pour voir le class
de chaque colonne essayer:
> sapply(result, class)
brand id
"factor" "character"
comme mentionné par @DavidArenburg dans les commentaires, une autre alternative est d'utiliser la fonction toString
:
aggregate(id ~ brand, data = DF, toString)
une belle ligne propre dans data.table
library(data.table)
setDT(DF)
DEUX OPTIONS:
résultats dans la 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 comme une chaîne de caractères
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
Note
bien que les deux résultats apparaissent le même (c'est-à-dire lorsque vous les Imprimez, ils look identique), ils sont en fait très différents et permettent des fonctionnalités différentes.
à savoir, en utilisant l'option list (la première) vous permet alors d'effectuer des fonctions sur l'orignal id
s.
ce dernier vous permettra d'afficher les informations plus facilement (y compris l'exportation vers CSV
ou excel
), mais pour fonctionner sur le id
's faudra les recoller.
Voici les informations de la base R:
myby <- by(df$id,df$brand,function(x)paste(x,collapse=","))
le formatage des objets" by " est bizarre. Vous pouvez prendre data.frame(id=c(myby))
et les marques deviendront rownames:
# id
# RadioShack 2308
# Rag & Bone 4466
# Ragu 1830,4518
# Ralph Lauren 1638,2719,2720,2721,2722
alternativement, si vous chargez le paquet 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