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?

44
demandé sur Frank 2013-05-17 00:08:17

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)
53
répondu Jilber Urbina 2016-07-02 16:55:53

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.

35
répondu Ricardo Saporta 2016-02-11 16:54:23

ou en utilisant dplyr :

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

DF est le nom de vos données.cadre.

17
répondu Sam Firke 2015-05-22 12:39:31

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
9
répondu Frank 2013-05-16 20:26:53