2011-06-22 52 views
3

我有這樣的數據:提取符合條件的唯一行r中

x <- matrix(c(2,2,3,3,3,4,4,20,33,2,3,45,6,9,45,454,7,4,6,7,5), nrow = 7, ncol = 3) 

在真實數據集,我有很多列的矩陣巨大。 我想提取關於第一列(Id)和最小的第三列的唯一行。例如,對於這個矩陣,我期望

y <- matrix(c(2,3,4,20,3,9,45,4,5), nrow = 3, ncol = 3) 

我嘗試了很多事情,但我無法弄清楚。 任何幫助表示讚賞。

由於提前, Zeray

回答

2

您可以使用包plyr。轉換爲data.frame這樣你就可以在第一列組,然後用which.min按組提取分鐘行:

library(plyr) 
ddply(as.data.frame(x), "V1", function(x) x[which.min(x$V3) ,]) 
    V1 V2 V3 
1 2 20 45 
2 3 3 4 
3 4 9 5 
+0

非常感謝大通。這可以解決我的問題。第二個是更通用的。 – Zeray

+0

@zeray - 由於語法一致,並且能夠輕鬆定義輸入和輸出數據的結構,因此我通常在我的大部分分組活動中使用plyr。每個人都需要一些變化,所以我給了你兩個選擇:)歡迎來到SO btw。 – Chase

+0

還要注意,「聚合」版本給出了2號和3號的錯誤答案... – Tommy

5

這裏有一個版本是比較複雜的,但稍快大通的ddply解決方案 - 一些200X更快:-)

uniqueMin <- function(m, idCol = 1L, minCol = ncol(m)) { 
    t(vapply(split(1:nrow(m), m[,idCol]), function(i, x, minCol) x[i, , drop=FALSE][which.min(x[i,minCol]),], m[1,], x=m, minCol=minCol)) 
} 

而下面的測試代碼:

nRows <- 10000 
nCols <- 100 
ids <- nRows/5 
m <- cbind(sample(ids, nRows, T), matrix(runif(nRows*nCols), nRows)) 
system.time(a<-uniqueMin(m, minCol=3L)) # 0.07 
system.time(ddply(as.data.frame(m), "V1", function(x) x[which.min(x$V3) ,])) # 15.72 
相關問題