考虑到因子频率,如何按客户ID汇总数据帧?

时间:2013-11-22 18:57:50

标签: r aggregate

我有一个数据框,记录了由“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)))] }

任何想法/想法?

谢谢,

伯纳

3 个答案:

答案 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)

tableddplywhich.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