2013-01-15 36 views
4

我有一個包含多列(17)的data.frame。 第2列具有相同的值的若干行,我想保持只有那些行中的一個,具體地,其具有在柱17如何在列A中創建一個唯一的R,並在列B中保留具有最大值的行

最大值例如一個:

A B 
'a' 1 
'a' 2 
'a' 3 
'b' 5 
'b' 200 

Would return 
A B 
'a' 3 
'b' 200 

(加上其餘的列)

到目前爲止,我一直在使用獨特的功能,但我認爲它隨機保留一個或只保留第一個出現。

**更新** 真實數據有376000行。我已經嘗試過data.table和ddply的建議,但他們需要永遠。任何想法是最有效的?使用包data.table

+2

做'tapply'或'plyr'搜索,你會發現很多,許多相同的問題。 – Andrie

+0

關於更新:您需要提供更多信息。我已經用10M行和26組測試了data.table解決方案,性能令人滿意。 – Roland

+0

我正在測試提供的第一個解決方案。 Roland最近的更新需要幾分鐘的時間。 謝謝! – biojl

回答

6

A液:

set.seed(42) 
dat <- data.frame(A=c('a','a','a','b','b'),B=c(1,2,3,5,200),C=rnorm(5)) 
library(data.table) 

dat <- as.data.table(dat) 
dat[,.SD[which.max(B)],by=A] 

    A B   C 
1: a 3 0.3631284 
2: b 200 0.4042683 
3

一個不那麼完美的解決方案使用R基本功能

> ind <- with(dat, tapply(B, A, which.max)) # Using @Roland's data 
> mysplit <- split(dat, dat$A) 
> do.call(rbind, lapply(1:length(mysplit), function(i) mysplit[[i]][ind[i],])) 
    A B   C 
3 a 3 0.3631284 
5 b 200 0.4042683 
+0

這與我的回答有所不同,目前還不清楚OP究竟想達到什麼目的。 – Roland

+3

該解決方案爲每列選擇最大值,但OP要求選擇一個**完整行**,其中第17列具有最高值。 @羅蘭的答案是唯一正確的答案,現在。 – betabandido

+0

謝謝你指出我的錯誤:D –

相關問題