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 = ","))