繁体   English   中英

使用r中的条件提取唯一行

[英]extract unique rows with a condition in 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

这是一个更复杂的版本,但比Chase的ddply解决方案更快 - 大约快200倍:-)

 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

您可以使用包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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM