Агрегация по уникальному идентификатору и объединение связанных значений в строку
У меня есть потребность, которую, я думаю, может быть удовлетворена 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
Как бы это сделать?
Ответы
Ответ 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