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

Wie rufe ich R-Funktionen auf, wie selektiere ich Daten, ich weiß nicht genau ....

Moderatoren: EDi, jogo

Antworten
janedoe

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

Beitrag 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
janedoe

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

Beitrag von janedoe »

Hallo,

weiß keiner Rat?

grüße
JaneD
bigben
Beiträge: 2780
Registriert: Mi Okt 12, 2016 9:09 am

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

Beitrag 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
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
jogo
Beiträge: 2086
Registriert: Fr Okt 07, 2016 8:25 am

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

Beitrag 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
janedoe

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

Beitrag 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
jogo
Beiträge: 2086
Registriert: Fr Okt 07, 2016 8:25 am

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

Beitrag 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
Antworten