Seite 1 von 1

die k größten Werte in Matrix finden, inkl. Index

Verfasst: Do Aug 10, 2017 9:46 pm
von janedoe
Schönen guten Abend,

ich habe eine 16x12 Matrix und möchte jetzt gerne die 5 höchsten und niedrigsten Werte inkl. den dazu gehörigen Indexen finden. Für die Absolutwerte hab ich das so gemacht

Code: Alles auswählen

D

     u
v              7           8           9          10          11          12          
  17 3.9116031 -2.2153532 -2.2507431 0.5238413 -2.1759626 
  18 29.6497717 -8.1624286 -4.7371381 7.4367932 -2.4631994 
  19 -99.4751556 -9.7746990 -2.9752587 3.0000000 -9.8823870 
  10 -7.0892168 -9.4613308 -9.9431389 3.0000000 2.8900380 
  11 -2.4306377 -2.5693028 -3.0000000 2.9282332 0.0000000 
  12 -6.6979949 -2.5180018 -2.7588040 3.0000000 0.3880960  
  13 -8.6868173 -9.0972868 -9.0412798 -2.8773536 0.2735219  
  
 ind<-which(D == max(D, na.rm=TRUE), arr.ind = TRUE)

      v      u
19  7    19
Wie finde ich die 5 höchsten/niedrigsten Werte und Indizes der Matrix D heraus?

Die Matrix D habe ich mit Hilfe image(D) graphisch dargestellt, ist es dann auch möglich, die 5 höchsten/niedrigsten Werte in die Graphik zu plotten? Ev. mit points?

danke & glg
JaneD

Re: die k größten Werte in Matrix finden, inkl. Index

Verfasst: So Aug 13, 2017 7:02 pm
von janedoe
Hallo,

weiß keiner Rat?

grüße
JaneD

Re: die k größten Werte in Matrix finden, inkl. Index

Verfasst: So Aug 13, 2017 7:46 pm
von bigben
Doch, doch,

es macht nur nicht soviel Spaß, wenn die Beispieldaten zu unzugänglich geliefert werden. Eine Matrix in R ist zugleich immer auch ein Vektor, nur mit der Zusatzinformation, auf wieviele Spalten sich dieser Vektor in der Matrix verteilt. Zur Demonstration verwenden wir folgende Matrix:

Code: Alles auswählen

D <- matrix(c(1,2,3,4,99,5,6,7,8,88,1,2,3,4,5,6),nrow=4)
print(D)
Die drei größten Werte kann man mit der Funktion sort genauso finden, wie in jedem Vektor auch:

Code: Alles auswählen

largest3 <- sort(D, decreasing = TRUE)[1:3]
print(largest3)
Genau wie bei einem Vektor kann man auch mit which finden, an welcher Stelle in dem Vektor diese drei Werte zu finden sind:

Code: Alles auswählen

for(i in 1:3) 
  print(which(D==largest3[i]))
Damit hast Du die Positionen in dem Vektor, der die Matrix gefüllt hat. Die Positionen in der Matrix kannst Du Dir daraus mit Ganzzahldivision und Modulo (Rest nach Ganzzahldivision) erarbeiten. Rest nach Ganzzahldivision und Ganzzahldivision gehen wie folgt:

Code: Alles auswählen

> 13%%2
[1] 1
> 13%/%2
[1] 6
LG,
Bernhard

Re: die k größten Werte in Matrix finden, inkl. Index

Verfasst: Di Aug 15, 2017 8:24 am
von jogo
Hier ist meine Version:

Code: Alles auswählen

set.seed(42)
M <- matrix(sample(24)+100, 4)
R <- matrix(rank(M), nrow(M))
sapply(1:5, function(r) which(r==R, arr.ind = TRUE))
Gruß, Jörg

Re: die k größten Werte in Matrix finden, inkl. Index

Verfasst: Do Aug 17, 2017 1:06 pm
von janedoe
Hallo zusammen,

vielen Dank für eure Antworten.

Wie soll ich Beispieldaten am besten liefern? Ich dachte, mit str() ist es ausreichend?

glg, JaneD

Re: die k größten Werte in Matrix finden, inkl. Index

Verfasst: Do Aug 17, 2017 1:38 pm
von jogo
Hallo Jane,

siehe auch: viewtopic.php?f=20&t=11#p32 im Bereich FAQ.
janedoe hat geschrieben: Do Aug 17, 2017 1:06 pm Wie soll ich Beispieldaten am besten liefern? Ich dachte, mit str() ist es ausreichend?
das ist nicht immer ausreichend.
str(df) zeigt die Struktur eines Objektes an - diese Information ist immens wichtig für die Unterscheidung zwischen character, factor, numeric. Diese Information ermöglicht zumindest, ähnliche Daten zu stricken.
Der Goldstandard für die Übermittlung von Daten ist:

Code: Alles auswählen

dput(df)
Damit wird das gesamte Objekt in reproduzierbarer Form gezeigt (Daten und Datentypen).
Bei großen Objekten (z.B. langen Dataframes) ist aber auch die Ausgabe von dput() sehr lang. Eventuell kann das Problem auch mit reduzierter Datenmenge dargestellt werden:

Code: Alles auswählen

dput(head(df))
Ansonsten sehe ich noch mindestens zwei Alternativen:
1. angehängte CSV-Datei (o.ä.) und den Code zum Einlesen der CSV-Datei in der Nachricht.
2. Übermittlung einer RData-Datei (so legt R Daten ab, siehe save() und save.image())

Wenn das Problem anhand der mit R mitgelieferten Daten dargestellt werden kann, erspart man sich die Übermittlung von Daten, siehe:

Code: Alles auswählen

data()
Gruß, Jörg