R 按唯一标识符聚合并将相关值连接到字符串中

R 按唯一标识符聚合并将相关值连接到字符串中,r,concatenation,aggregate,R,Concatenation,Aggregate,我有一个需求,我想象可以通过聚合或重塑来满足,但我不太清楚 我有一个品牌名称列表,以及随附的ID号ID。该数据格式较长,因此名称可以有多个ID。我想按品牌名称进行重复数据消除,并将多个可能的id连接成一个由注释分隔的字符串 例如: brand id RadioShack 2308 Rag & Bone 4466 Ragu 1830 Ragu 4518 Ralph Lauren 1638

我有一个需求,我想象可以通过聚合或重塑来满足,但我不太清楚

我有一个品牌名称列表,以及随附的ID号ID。该数据格式较长,因此名称可以有多个ID。我想按品牌名称进行重复数据消除,并将多个可能的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

我将如何实现这一点?

让我们调用data.frame DF

使用聚合的另一种替代方法是:

正如@davidernburg在评论中提到的,另一种选择是使用toString函数:

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

下面是base R中的信息:

myby <- by(df$id,df$brand,function(x)paste(x,collapse=","))
或者,如果加载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
data.table中的一行非常干净

两种选择: 结果列表

结果作为字符串

笔记 即使这两个结果在打印时看起来是一样的,但它们看起来是一样的,事实上它们非常不同,允许使用不同的功能

也就是说,使用列表选项,第一个选项允许您在原始ID上执行功能

后者将使您能够更轻松地显示信息,包括导出到CSV或excel,但要对id进行操作,需要将其重新拼接。

或使用:


其中DF是data.frame的名称。

非常奇怪,R不允许我输出这个data.frame…我想是因为id是一个列表。如何导出到CSV?@Jilber我认为id输出列的类应该是字符而不是列表,因为OP想要导出数据帧。+1。我喜欢这个解决方案,因为它是供我自己使用的。不过,对于OP的问题,我认为您可能需要将其更改为aggregateid~brand,paste,collapse=,data=df或类似。值得一提的是,aggregateid~brand,df,toString也可能发生。如果我想做同样的事情,但仅针对特定值,会发生什么情况?。我的意思是,在您的示例中,仅id==2308。在您想要的输出中,Ragu不应该出现两次,对吗?对于每个品牌,您希望结果是id列表还是拼凑在一起的单个字符串?谢谢!ListId有效,但为什么?@LauriK,ListId与答案中的第一个选项相同。唯一的区别是列表中的名称是否明确给出。outter列表data.table将转换为含义列,因为所有data.tables和data.frames实际上只是一个列列表。内部列表表示每个单元格中的值都是ListThank!我使用的是Pastid,sep=,最后得到的是未聚合的结果。事实证明,我需要使用pasteid,collapse=,这将使汇总列成为逗号分隔的字符串类型。。不是一个向量…不,正如在其他答案中一样,结果是data.frame,一个名为id of class character的向量包含id字符串,按问题中的要求用逗号分隔。is.vectorDF$id返回TRUE。如果你有一个关于这个方法的问题,考虑把它作为一个新的问题发布。me@SamFirke,请您告知我如何使用您的解决方案仅粘贴唯一的id值,而存在与品牌对应的重复id值?谢谢尝试添加unique,使其成为pasteuniqueid,collapse=,-如果这样做不起作用,那么应该发布一个新问题。
aggregate(id ~ brand, data = DF, toString)
myby <- by(df$id,df$brand,function(x)paste(x,collapse=","))
#                                    id
# RadioShack                       2308
# Rag & Bone                       4466
# Ragu                        1830,4518
# Ralph Lauren 1638,2719,2720,2721,2722
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
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
library(dplyr)
DF %>%
  group_by(brand) %>%
  summarise(id = paste(id, collapse = ","))