2016-09-15 85 views
2

我有一个数据框有2列:'销售'和'月'。我想添加一个在每个月内对销售进行排名的列。有谁知道最简单的方法是什么?我在考虑'tapply',但它给了我一个列表,我不能将它添加回数据框(简单或简洁)。添加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. 
+1

的[添加一个“等级”栏的数据帧(可能的复制http://stackoverflow.com/questions/15170777/添加排名列到数据框) – agenis

回答

3

我们可以使用avebase R创建列

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)),按 '月' 进行分组,我们分配(:=)的 '销售' 的rank打造 '排名'

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

这是一个很好的解决方案。或者干脆用'DT [,mrank:= rank( - 销售),by =月]'。 –

+0

@SunBee是的,你的意思是'DT < - as.data.table(df1)'对吗? – akrun

+1

你说得对。转换为data.table是必需的。我立场纠正。 –

1

您可以使用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))) 

虽然我觉得quetion是this one重复