2016-06-25 4 views
2

Ich habe eine Matrix vom Typ numerisch, mit Dim 10000 * 50. Jetzt möchte ich den Index der Top 5 Elemente in jeder Zeile in der Reihenfolge von finden ihre Werte. z.B. könnte eine Probe wie folgt aussehen:finde den Index der oberen n Elemente in einem Vektor in Reihenfolge [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 

Dann möchte ich die Ausgabe so aussehen:

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

ich nur this question finden könnten, was erklärt, wie oben n Elemente zu finden, aber nicht in der Reihenfolge der Werte.

Antwort

2

apply() ist perfekt für zeilenweise Operationen auf Matrizen. Sie könnten

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 

tun Dies läuft die order() Funktion zeilenweise auf der Matrix v1 dann die ersten fünf Werte für jeden einzelnen nimmt, ist das Ergebnis der Umsetzung, da Sie Zeilen nicht Spalten angeben.

1

Dies kann auch mit data.table nach melting in 'long' Format, gruppiert nach 'Var1', wir die order von 'Wert'

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 

Oder mit 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 
bekommen getan werden
+0

Beide Werke, aber diese sind langsamer als die Antwort von Richard Scriven vorgeschlagen. base R Lösung benötigt ca. 20% mehr Zeit, während die data.table 80% mehr Zeit benötigt. Danke für den Vorschlag. –

+0

@ViragSwami Vielen Dank für Ihre Nachricht. Ich dachte, die 'data.table' wäre schnell. Wahrscheinlich hat die 'Schmelze' (von reshape2) die Zeit erhöht. – akrun

Verwandte Themen