通过唯一标识符聚合并将相关值连接成一个string

我有一个需要,我想可以通过aggregatereshape来满足,但我不能完全弄清楚。

我有一个名称( brand ),并附有身份证号码( id )的名单。 这个数据的格式很长,所以名字可以有多个ID。 我想通过名称( brand )去重复,并将多个可能的id连接成由注释分隔的string。

例如:

 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 

另一种使用aggregate是:

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

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

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

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

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

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 > 

结果为一个string

 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 

注意

尽pipe两个结果看起来是一样的(即当你打印它们时,它们看上去完全相同),但它们实际上是非常不同的,并且允许不同的function。

也就是说,使用list选项(第一个选项)可以让你在orignal id上执行函数。

后者将允许您更容易地显示信息(包括导出到CSVexcel ),但要操作的id将需要拼接回来。

或者使用dplyr :

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

DF是你的data.frame的名字。

这是基于R的信息:

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

“by”对象的格式很奇怪。 你可以把data.frame(id=c(myby))和品牌变成rownames:

 # 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