2013-10-13 55 views

回答

3

你有不同的選擇的兩個層面,一個可以tapply

> df<-read.table(text=" c1 c2 
1 1 b 
2 2 a 
3 3 a 
4 4 a 
5 3 a 
6 2 b 
7 6 a 
8 4 b 
9 8 b 
10 7 a") 
> df 
    c1 c2 
1 1 b 
2 2 a 
3 3 a 
4 4 a 
5 3 a 
6 2 b 
7 6 a 
8 4 b 
9 8 b 
10 7 a 
> tapply(df$c1, df$c2, function(x) sort(x)[3]) 
a b 
3 4 

或者,使用plyr包,您可以:

> library(plyr) 

> ddply(df, .(c2), summarise, c1=sort(c1)[3]) 
    c2 c1 
1 a 3 
2 b 4 
1

使用上一個主題data.table

library(data.table) 
dt<-data.table(df1) 
dt[,sort(c1)[3],by=c2] 
    c2 V1 
1: b 4 
2: a 3 
+2

一鍵可用於預先分類:' setkey的(DT,C2,C1); DT [,C1 [3],通過= C2]'。在鍵中包含「c2」只是確保a在結果之前出現b。 – Frank

+1

感謝洞察@Frank – Metrics

4

本質上的變化:

aggregate(c1 ~ c2, df, function(x) sort(x)[3]) 
# c2 c1 
# 1 a 3 
# 2 b 4 
+0

我總是對自己說「你應該在你的代碼中使用更多的公式」:)。 +1 – Michele

+1

+1 - 對於速度,假設有很多行,你可以做'sort(x,partial = 3)[3]' – flodel

相關問題