2015-12-22 67 views
0

我有這個問題,對於我的生活,我一直無法解決。一些幫助將不勝感激。在R中獲取最小值的行

假設我們有這樣的data.frame:

Session <- c("A", "B", "C", "A", "B", "A") 
V1 <- c(1, 1, 2, 3, 2, 4) 
V2 <- c(1, 1, 2, 1, 1, 3) 
V3 <- c(3, 1, 2, 3, 2, 2) 
df <- data.frame(Session, V1, V2, V3) 
df 
    Session V1 V2 V3 
1  A 1 1 3 
2  B 1 1 1 
3  C 2 2 2 
4  A 3 1 3 
5  B 2 1 2 
6  A 4 3 2 

我想獲得的是有MOST最低值由變量會話GROUPED每列行。

預期輸出中,在這種情況下,會是以下幾點:

Session V1 V2 V3 
1  A 1 1 3 
2  B 1 1 1 
3  C 2 2 2 

如果不止一個行有每個變量的最小值相同數量的,一排應該是足夠有效的。

非常感謝,

Aleix。

回答

0

好的,我找到了一個辦法,我很確定是不是最好的辦法。如果你可以改進這個解決方案,請做。

首先我創建了一個data.table從DF對象:

library(data.table) 
dt <- setDT(df) 

然後,我還創建了返回在載體的最本元素的值的函數:

most <- function(a1){ return(as.integer(names(sort(table(a1), decreasing = TRUE))[1]))} 

爲了測試它,我執行了以下操作:

most(c(1,2,3,3,3,2,1)) 
[1] 3 

然後我中搜索的結果中包含的最小值爲每列中的行:

mins <- dt[, list(.I[which.min(V1)], .I[which.min(V2)], .I[which.min(V3)]), by = "Session"] 
mins 
    Session V1 V2 V3 
1:  A 1 1 6 
2:  B 2 2 2 
3:  C 3 3 3 

最後,我使用的先前結果來搜索那些行的原始data.table對象(DT)等上所以:

result <- dt[apply(mins[,, by=c("Session")], FUN = max_mins, MAR = 1)] 
result 
    Session V1 V2 V3 
1:  A 1 1 3 
2:  B 1 1 1 
3:  C 2 2 2 

就是這樣。我真的希望這可以幫助某人。