В R использование `unique()` с дополнительными условиями для извлечения подматриц: простое решение без plyr

В 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

с помощью unique на M[,1], указав сохранить строку с максимальным значением во втором столбцеM, В конце алгоритм должен сохранить строку [2,] из набора \{[1,], [2,]\}, к несчастью unique() возвращает мне вектор с фактическими значениями, а не номера строк, после устранения дубликатов.

Есть ли способ получить asnwer без пакета plyr? Большое спасибо, Авитус

3 ответа

Решение

Вот как:

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

Не самый эффективный

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

Ты ищешь 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
Другие вопросы по тегам