В 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