小编Ber*_*rdo的帖子

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

我有一个数据框,记录了由"ID"标识的不同客户的购买情况.此外,它记录了他/她每次购买的位置,例如商店#1或商店#2:

> head(data)
ID store
1    1
2    3
1    1
1    2
2    3
3    1
3    2
Run Code Online (Sandbox Code Playgroud)

我一直试图做的是,为每个顾客挑选他大部分购买他/她的商店.我正在寻找的输出将是一个类似于以下内容的数据框:

ID store
1   1
2   3
3   1
Run Code Online (Sandbox Code Playgroud)

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)))] }

有什么想法/想法吗?

谢谢,

贝尔纳

aggregate r

5
推荐指数
1
解决办法
254
查看次数

在 R 中使用匹配和应用

> df = data.frame(id = 1:5, ch_1 = 11:15,ch_2= 10:14,selection = c(11,13,12,14,12))
> df
  id ch_1 ch_2 selection
1  1   11   10        11
2  2   12   11        13
3  3   13   12        12
4  4   14   13        14
5  5   15   14        12
Run Code Online (Sandbox Code Playgroud)

鉴于此数据集,我需要一个遵循规则的附加列:

  1. 如果选择是两个选择(ch_1 和 ch_2)之一,则返回选择的编号(1 或 2)
  2. 如果选择不是两个选择中的,则返回 3

我需要一种方法来为每一行执行此操作。对于单行,执行以下代码工作得很好,但我似乎无法找到一种方法来使用它来将它apply运行到数据帧的每一行。寻找一种不仅可以应用于更多的解决方案两列,运行速度比传统循环快

df=df[1,]

if (df$selection %in% df[,paste("ch_",1:2,sep="")]) {
  a = which(df[,paste("ch_",1:2,sep="")]==df$selection)
} else {
  a = 3
}
# OR
ifelse(df$selection %in% df[,paste("ch_",1:2,sep="")],1,3)
# OR
match(df$selection,df[,paste("ch_",1:2,sep="")])
Run Code Online (Sandbox Code Playgroud)

r match apply

5
推荐指数
1
解决办法
139
查看次数

标签 统计

r ×2

aggregate ×1

apply ×1

match ×1