将 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
重复
我有一个包含 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
重复