2

在 R 中,设M为矩阵

     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    1    3    3
[3,]    2    4    5
[4,]    6    7    8

我想选择子矩阵m

     [,1] [,2] [,3]
[1,]    1    3    3
[2,]    2    4    5
[3,]    6    7    8

使用uniqueon M[,1],指定将具有最大值的行保留在第二列M中。最后,算法应该保持 row[2,]与 set 无关\{[1,], [2,]\}。不幸的是unique(),在消除重复项后,我返回了一个带有实际值而不是行号的向量。

有没有办法在没有包 plyr 的情况下获得答案?非常感谢,阿维图斯

4

3 回答 3

1

不是最有效的:

M <- matrix(c(1,1,2,6,2,3,4,7,3,3,5,8),4)

t(sapply(unique(M[,1]),function(i) {temp <- M[M[,1]==i,,drop=FALSE]
                                    temp[which.max(temp[,2]),]                                  
         }))

#     [,1] [,2] [,3]
#[1,]    1    3    3
#[2,]    2    4    5
#[3,]    6    7    8
于 2013-05-22T13:38:26.093 回答
1

你正在寻找duplicated.

m <- as.matrix(read.table(text="1    2    3
1    3    3
2    4    5
6    7    8"))
m <- m[order(m[,2], decreasing=TRUE), ]
m[!duplicated(m[,1]),]

#      V1 V2 V3
# [1,]  6  7  8
# [2,]  2  4  5
# [3,]  1  3  3
于 2013-05-22T13:28:41.797 回答
1

就是这样:

is.first.max <- function(x) seq_along(x) == which.max(x)

M[as.logical(ave(M[, 2], M[, 1], FUN = is.first.max)), ]
#      [,1] [,2] [,3]
# [1,]    1    3    3
# [2,]    2    4    5
# [3,]    6    7    8
于 2013-05-22T13:30:26.587 回答