2012-11-21 65 views
4

可能重複:
Only keep min value for each factor level如何有效地選擇R中具有最小值的行?

這裏是我的問題,我想選擇與指定列最小值行。 例如:

df <- data.frame(A=c("a","a","b","b"),value=1:4) 

我想要的結果是

A value 
a  1 
b  3 

我可以byddply做,但他們是相當緩慢的,當df是巨大的,在A許多不同的價值。

do.call(rbind,by(df,df$A, function(x) x[which.min(abs(x$value)),],simplify=FALSE)) 

ddply(df, ~A, function(x){x[which.min(abs(x$value)),]}) 

有什麼建議嗎?

非常感謝!

+0

我選擇了可​​能重複的,因爲它有一些基準在裏面。希望能幫助到你。 –

+0

順便說一句,萬一一些搜索技巧幫助,我發現這個問題通過搜索「[r] + which.min +基準」,它返回了單個問題。我想這個訣竅是從「高效」到搜索「基準」。 –

回答

0

tapply做到這一點:

> tapply(df$value, df$A, min) 
a b 
1 3 

編輯:使用by代替tapply,我們可以保留行名稱:相當快

df <- data.frame(A=c("a","a","b","b"),value=11:14) 
df 
## A value 
## 1 a 11 
## 2 a 12 
## 3 b 13 
## 4 b 14 

do.call(rbind, unname(by(df, df$A, function(x) x[x$value == min(x$value),]))) 
## A value 
## 1 a 11 
## 3 b 13 
+0

速度很快,但我失去了其他信息。如何返回行索引? – shao

+0

對不起,我誤解了你的問題。我以爲你想要的價值(這裏同意指數)。 –

2

data.table是大data.frames如果您設置密鑰。

dt <- data.table(df, key="A") 
dt[, list(value=min(value)), by=A] 

參考文獻:

+1

有趣。如何返回其他列而不是「值」和「A」? – shao

+0

通過將列名稱作爲向量傳遞(例如'by = c(「A」,「Bcolumn」,「Ccolumn」)'),您可以有多個「by」列。你可以通過將它們包含在列表調用中來計算多個統計信息(例如'list(min_value = min(value),max_value = max(value))' –

+1

對不起,我沒有弄清楚,假設有三列「B 「,在df中,命令我只有」值「和」A「,如何輸出」B「列 – shao

相關問題