我有一个数据框,记录了由“ID”标识的不同客户的购买情况。此外,它记录了他/她每次购买的位置,例如商店#1或商店#2:
> head(data)
ID store
1 1
2 3
1 1
1 2
2 3
3 1
3 2
我一直试图做的是,为每个顾客挑选他大部分购买他/她的商店。我正在寻找的输出将是一个类似于:
的数据框ID store
1 1
2 3
3 1
ID#3的客户在不同的商店进行了2次购买,这与聚合功能选择哪一个无关。然而,ID号1进行了3次购买,2次在商店#1,1次在商店#2,所以我必须选择商店#1。
我正在努力寻找任何一种方法来做到这一点,但我的方法是基于使用聚合函数
newdata <- aggregate(data$store,list(data$ID),FUN)
使用聚合函数是最好的方法吗?我在这里看到的问题是哪个函数用作FUN。我尝试使用我在教程中找到的模式函数,但没有成功,它被定义为:
Mode <- function(x) {
ux <- unique(x)
ux[which.max(tabulate(match(x, ux)))]
}
任何想法/想法?
谢谢,
伯纳
答案 0 :(得分:2)
您可以尝试使用aggregate
,基本上以您开始时的想法为基础。
aggregate(store ~ ID, data = df, function(x){
x[which.max(table(x))]
})
# ID store
# 1 1 1
# 2 2 3
# 3 3 1
答案 1 :(得分:0)
table
,ddply
和which.max
的组合可以满足您的需求:
d <- read.table(text="ID store
1 1
2 3
1 1
1 2
2 3
3 1
3 2", header=TRUE)
> ddply(data.frame(table(d)), .(ID), summarize, store = which.max(Freq))
ID store
1 1
2 3
3 1
答案 2 :(得分:0)
我想将@ tcash21提出的解决方案扩展到存在频率相同的商店的情况。在您的示例中,商店1和2由具有相同频率的同一个人(ID 3)访问,如列联列表中所示:
table(data)
store
ID 1 2 3
1 2 1 0
2 0 0 2
3 1 1 0
总结:
ddply(data.frame(table(data)), .(ID), summarise, store = which(Freq==max(Freq)))
ID store
1 1 1
2 2 3
3 3 1
4 3 2