Подтвердить что ты не робот

Агрегация по уникальному идентификатору и объединение связанных значений в строку

У меня есть потребность, которую, я думаю, может быть удовлетворена aggregate или reshape, но я не могу понять.

У меня есть список имен (brand) и сопровождающий идентификационный номер (id). Эти данные в большой форме, поэтому имена могут иметь несколько идентификаторов. Я хотел бы удалить дубликат по имени (brand) и объединить несколько возможных id в строку, разделенную комментарием.

Например:

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 

должен стать:

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

Как бы это сделать?

4b9b3361

Ответ 1

Позвоните в свой файл 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

Другая альтернатива, использующая aggregate:

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

Это дает тот же результат, и теперь id больше не является list. Благодаря комментарию @Frank. Чтобы увидеть class каждого столбца, попробуйте:

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

Как упоминалось в комментариях @DavidArenburg, другая альтернатива использует функцию toString:

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

Ответ 2

Хорошая чистая строка в data.table

library(data.table)
setDT(DF)

ДВА ОПЦИИ:

результаты как список

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
> 

результат в виде строки

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

Примечание

Несмотря на то, что два результата отображаются одинаково (т.е. когда вы их печатаете, они выглядят одинаково), они на самом деле очень разные и позволяют использовать разные функции.

А именно, использование опции списка (первая) позволяет вам выполнять функции на orignal id s.

Последний позволит вам легче отображать информацию (включая экспорт в CSV или excel), но для работы с id потребуется их сплайсинг.

Ответ 3

Или используя dplyr:

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

Где DF - имя вашего файла data.frame.

Ответ 4

Здесь информация в базе R:

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

Форматирование объектов "by" является странным. Вы можете взять data.frame(id=c(myby)), и бренды станут именами ростов:

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

В качестве альтернативы, если вы загрузите пакет data.table, это будет работать:

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