通过唯一标识符进行聚合并将相关值连接到字符串中

时间:2013-05-16 20:08:18

标签: r concatenation aggregate

我有一个需要,我认为可以通过aggregatereshape来满足,但我无法弄明白。

我有一个名单列表(brand)和附带的ID号(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

我将如何做到这一点?

4 个答案:

答案 0 :(得分:58)

让我们调用您的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在评论中所提到的,另一种选择是使用toString函数:

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

答案 1 :(得分:37)

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
> 

以字符串结果

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

注意

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

即,使用list选项(第一个)允许您在orignal id上执行函数。

后者可让您更轻松地显示信息(包括导出到CSVexcel),但要对id进行操作,则需要将其拼接回来。< / p>

答案 2 :(得分:20)

或使用dplyr

"B"

library(dplyr) DF %>% group_by(brand) %>% summarise(id = paste(id, collapse = ",")) 是data.frame的名称。

答案 3 :(得分:10)

以下是基础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