2016-06-25 2 views
2

У меня есть матрица типа numeric с dim 10000 * 50. Теперь я хочу найти индекс из 5 верхних элементов в каждой строке порядка их значения. например образец может выглядеть следующим образом:найти индекс верхних n элементов в векторе по порядку [R]

set.seed(2) 
v1 <- matrix(runif(20 , 0 ,20) , 2 ,10) 
v1 
#   [,1]  [,2]  [,3]  [,4]  [,5]  [,6]  [,7]  [,8]  [,9] [,10] 
#[1,] 3.697645 11.466527 18.87679 2.58318 9.36037 11.053481 15.210266 8.105644 19.527970 8.896185 
#[2,] 14.047481 3.361038 18.86950 16.66898 10.99967 4.777895 3.616402 17.070969 4.516509 1.499588 

Тогда я хочу, выход выглядеть следующим образом:

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

я смог найти только this question, который объясняет, как найти топ п элементов, но не в порядке значения.

ответ

2

apply() идеально подходит для последовательных операций над матрицами. Вы могли бы сделать

t(apply(v1, 1, function(x) order(-x)[1:5])) 
#  [,1] [,2] [,3] [,4] [,5] 
# [1,] 9 3 7 2 6 
# [2,] 3 8 4 1 5 

Это бежит order() функции построчно вниз матриц v1 затем принимает первые пять значений для каждого из них, перенося результатом, так как вы задаете строки не столбцы.

1

Это также может быть сделано с data.table после melting в 'длинных' формате, сгруппированных по 'Var1', мы получим order из 'значение'

library(reshape2) 
library(data.table) 
setDT(melt(v1))[, head(order(-value),5), Var1] 
# Var1 V1 
#1: 1 9 
#2: 1 3 
#3: 1 7 
#4: 1 2 
#5: 1 6 
#6: 2 3 
#7: 2 8 
#8: 2 4 
#9: 2 1 
#10: 2 5 

Или с помощью base R

ave(-v1, row(v1), FUN = order)[,1:5] 
#  [,1] [,2] [,3] [,4] [,5] 
#[1,] 9 3 7 2 6 
#[2,] 3 8 4 1 5 
+0

Обе работы, но они медленнее, чем ответ Ричарда Скривена. базовый R-решение занимает около 20% больше времени, в то время как data.table занимает 80% больше времени. Спасибо за предложение. –

+0

@ViragSwami Спасибо за внимание. Я думал, что 'data.table' будет быстрым. Вероятно, «расплав» (из reshape2) увеличил время. – akrun

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