Aggregazione per identificatore univoco e concatenazione di valori correlati in una stringa

Ho una necessità che immagino possa essere soddisfatta aggregate o reshape , ma non riesco a capirlo.

Ho un elenco di nomi ( brand ) e numero ID di accompagnamento ( id ). Questi dati sono in forma estesa, quindi i nomi possono avere più ID. Mi piacerebbe disdegnare con il nome ( brand ) e concatenare i molteplici possibili id in una stringa separata da un commento.

Per esempio:

 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 

dovrebbe diventare:

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

Come potrei realizzare questo?

Chiamiamo il tuo 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 

Un’altra alternativa che utilizza l’ aggregate è:

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

Questo produce lo stesso risultato e ora id non è più una list . Grazie al commento di @Frank. Per vedere la class di ogni colonna prova:

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

Come menzionato da @DavidArenburg nei commenti, un'altra alternativa sta usando la funzione toString :

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

Una bella riga pulita in data.table

 library(data.table) setDT(DF) 

DUE OPZIONI:

risultati come 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 > 

risultati come una stringa

 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

Anche se i due risultati appaiono uguali (cioè quando li stampi, sembrano identici), sono in realtà molto diversi e consentono diverse funzionalità.

Vale a dire, l’utilizzo dell’opzione lista (la prima) consente di eseguire successivamente le funzioni sugli id .

Quest’ultimo ti consentirà di visualizzare le informazioni più facilmente (inclusa l’esportazione in formato CSV o excel ), ma per operare sugli id sarà necessario ricollegarle.

O usando dplyr :

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

Dove DF è il nome del tuo data.frame.

Ecco le informazioni nella base R:

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

La formattazione degli oggetti "per" è strana. Puoi prendere data.frame(id=c(myby)) e le marche diventeranno nomi di gioco:

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

In alternativa, se carichi il pacchetto data.table , questo funzionerà:

 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