2013-05-22 2 views
2

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

 [,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? Большое спасибо, Avitus

+0

Мне любопытно, почему вы хотите, чтобы избежать использования 'plyr'? –

+0

Я не программист, поэтому я хотел бы как можно больше узнать пошаговое :-). plyr отлично, кстати. – Avitus

ответ

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 
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 
+0

, но это не сохранит исходный порядок строк. – flodel

+0

Если ОП указывает, что в качестве требования я удалю свой ответ. –

+0

@flodel и Matthew Plourde: порядок строк не является проблемой. Оба ответа очень ценятся; Я искал короткий, но умный код, чтобы получить результат. Большое спасибо! Avitus – Avitus

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 
+0

Я никогда не использовал 'sapply' раньше :-). Спасибо за ваш код. Интересно, однако, использование 't()' в самом конце. – Avitus

 Смежные вопросы

  • Нет связанных вопросов^_^