通过唯一标识符聚合并将相关值连接成一个string
我有一个需要,我想可以通过aggregate
或reshape
来满足,但我不能完全弄清楚。
我有一个名称( 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
上执行函数。
后者将允许您更容易地显示信息(包括导出到CSV
或excel
),但要操作的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