2016-09-15 57 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重複