r-通过唯一标识符聚合并将相关值连接到字符串中

这个问题已经在这里有了答案:

  • 折叠/连接/聚集一列为每个组中的单个逗号分隔的字符串                                     3个答案

我需要brandid可以满足我的需求,但我不太清楚。

我有一个名称列表(brand)和随附的ID号(id)。 此数据的格式很长,因此名称可以有多个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

我将如何完成?

roody asked 2020-01-19T04:25:01Z
4个解决方案
60 votes

让我们给您的数据打电话。帧toString

> 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

使用toString的另一种选择是:

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

这会产生相同的结果,现在toString不再是list。 感谢@Frank评论。 要查看每列的class,请尝试:

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

如@DavidArenburg在评论中提到的,另一种替代方法是使用toString函数:

aggregate(id ~ brand, data = DF, toString)
Jilber Urbina answered 2020-01-19T04:25:39Z
37 votes

CSV中的一条漂亮干净的线

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

注意

即使两个结果看起来相同(也就是说,当您打印它们时,它们看起来相同),但实际上它们是非常不同的,并且允许使用不同的功能。

即,使用列表选项(第一个),然后可以对原始的CSVs执行功能。

后者将使您更轻松地显示信息(包括导出到CSVexcel),但是要在id上进行操作,则需要将它们拼接起来。

Ricardo Saporta answered 2020-01-19T04:26:30Z
23 votes

或使用dplyr:

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

其中DF是data.frame的名称。

Sam Firke answered 2020-01-19T04:26:54Z
10 votes

这是基数R中的信息:

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

“ by”对象的格式很奇怪。 您可以输入data.table,品牌将变为行名:

#                                    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
Frank answered 2020-01-19T04:27:23Z
translate from https://stackoverflow.com:/questions/16596515/aggregating-by-unique-identifier-and-concatenating-related-values-into-a-string