将 tapply 添加到列

Adding tapply to a column

我有一个包含 2 列的数据框:'sales' 和 'month'。我想添加一个列来对每个月的销售额进行排名。有谁知道这样做最简洁的方法是什么?我正在考虑 'tapply' 但它给了我一个列表,我无法将它添加回数据框(简单或简洁)。

Sales Month      Rank
100   1          3
200   2          1
300   3          1
150   1          2
220   1          1

100 is third place amongst sales that belong to month 1 while 220 is first place for month 1. 

我们可以使用 base R 中的 ave 创建列

df1$Rank <- with(df1, ave(-Sales, Month, FUN = rank))
df1$Rank
#[1] 3 1 1 2 1

或者另一个简洁高效的选项是 data.table。将 'data.frame' 转换为 'data.table' (setDT(df1)),按 'Month' 分组,我们分配 (:=) 'Sales' 的 rank创建 'Rank'

library(data.table)
setDT(df1)[, Rank := rank(-Sales) , Month]

您可以使用 dplyr 库:

library(dplyr)
df = data.frame(sales=c(100, 200, 300, 150, 220), month=c(1,2,3,1,1))
df %>% group_by(month) %>% mutate(rank(desc(sales)))

尽管我认为这个问题与 this one

重复