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

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

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

我有一个姓名列表(
品牌
),以及随附的身份证号码(
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

我将如何实现这一点?

让我们调用您的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
使用聚合的另一种选择是:

result <- aggregate(id ~ brand, data = DF, paste, collapse = ",")
正如@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

dtdata.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

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

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

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

或使用:


其中,
DF
是您的data.frame的名称。

非常奇怪,R不允许我输出这个data.frame…我想是因为
id
是一个列表。如何导出到CSV?@Jilber您的“id”输出列的类应该是“character”(而不是list),因为OP想要导出数据帧。+1。我喜欢这个解决方案,因为它是供我自己使用的。不过,我想您可能需要将OP的问题更改为聚合(id~brand,paste,collapse=“,”,data=df)
或类似。值得一提的是聚合(id~brand,df,toString)
如果我想做同样的事情,但只针对特定的值,那么会发生什么?。我的意思是,在您的示例中,仅使用
id==2308
。在您想要的输出中,“Ragu”不应该出现两次,对吗?对于每个品牌,您希望结果是id的
列表还是拼凑在一起的单个字符串?谢谢!list(list(id))有效,但为什么?@LauriK,
list(list(id))
与答案中的第一个选项相同。唯一的区别是列表中的名称是否明确给出。outter
列表
,data.table将转换为“column”的意思(因为所有data.tables和data.frames实际上只是一个列列表)。内部的
列表
指示每个单元格中的值将是一个列表谢谢!我使用了
粘贴(id,sep=“,”)
,最后得到了未聚合的结果。事实证明,我需要使用
粘贴(id,collapse=“,”)
,这将使摘要列成为逗号分隔的字符串类型。。不是向量…不,正如在其他答案中一样,结果是data.frame,其中一个名为
id
的向量属于
character
类,包含
id
字符串,按问题要求用逗号分隔
is.vector(DF$id)
返回
TRUE
。如果你有一个关于这个方法的问题,考虑把它作为一个新的问题发布。me@SamFirke,您能告诉我如何使用您的解决方案仅粘贴
id
的唯一值,而
id
的值与
品牌
对应吗?谢谢尝试添加
unique
,使其成为
粘贴(unique(id),collapse=“,”
——如果这样做不起作用,则应该发布一个新问题。
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 = ","))