通过聚合另一列来查找列中的公共元素

时间:2014-05-01 23:52:59

标签: r aggregate rank

我在R中需要一些帮助。我想找出每个ID中出现的品牌。我的数据包含三个制表符分隔的字段,让我们称之为ID(识别一个人),时间,品牌:

ID time brand
01 1111 BMW
01 1112 BMW
01 1113 Audi
01 1114 Mercedes
02 1115 Audi
02 1115 Cadillac
02 1116 BMW
03 1117 Acura
03 1117 Audi
03 1117 BMW
03 1118 Mercedes
.......

根据数据,所有ID共有的品牌是宝马和奥迪。时间字段并不总是唯一的。但是,由于我有更多的记录,我无法确定所有ID是否有共同的品牌。在这种情况下,我希望获得大多数ID中出现的品牌排名。

我有很多独特的ID和品牌,所以我不能在这里使用这些解释 How to find common elements from multiple vectors?

我想知道如何在R中做到这一点。谢谢。

2 个答案:

答案 0 :(得分:1)

data = read.table(text = "ID time brand
        01 1111 BMW
        01 1112 BMW
        01 1113 Audi
        01 1114 Mercedes
        02 1115 Audi
        02 1115 Cadillac
        02 1116 BMW
        03 1117 Acura
        03 1117 Audi
        03 1117 BMW
        03 1118 Mercedes", header = TRUE)

require("data.table")
DT <- as.data.table(data)

# Count instances of brand
DT[, count := .N, by="brand"]

# Keep the brand that appears more times by ID
result = DT[, list(max_count = max(count), time), by="brand,ID"]
result

# Drop max_count column by reference in case you want to
set(result, j=c("max_count"), value=NULL)

print(result)
#       brand ID time
# 1:      BMW  1 1111
# 2:      BMW  1 1112
# 3:     Audi  1 1113
# 4: Mercedes  1 1114
# 5:     Audi  2 1115
# 6: Cadillac  2 1115
# 7:      BMW  2 1116
# 8:    Acura  3 1117
# 9:     Audi  3 1117
# 10:      BMW  3 1117
# 11: Mercedes  3 1118

答案 1 :(得分:0)

您可以使用table找到每个ID中出现的品牌。

> tab <- table(dat$ID, dat$brand)
> names(which(apply(tab, 2, function(x) !any(x == 0))))
## [1] "Audi" "BMW"

对于那些未出现在每个ID中的品牌,

> A <- apply(tab, 2, sum)
> A[A < nrow(tab)]
## Acura Cadillac Mercedes 
##     1        1        2 

最重要的是将它们排序

> sort(A[A < nrow(tab)], decreasing = TRUE)
## Mercedes    Acura Cadillac 
##        2        1        1