Identifizierung der Variablen mit dem höchsten Wert

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

Moderatoren: EDi, jogo

NeugierundOrga

Identifizierung der Variablen mit dem höchsten Wert

Beitrag von NeugierundOrga »

Liebes Forum,

ich bin aufgeschmissen mit folgender Rechenoperation:

Ich habe vier Variablen A, B, C, D. Jede stellt einen Mittelwert einer Skala dar, ist numerisch (bzw. integer). Ich muss nun die beiden Variablen mit dem höchsten und zweithöchsten Wert identifizieren und die Differenz bilden. Konkret benötige ich
1. eine neue Variable/Spalte, die aus den gegebenen Variablen diejenige mit dem höchsten Wert identifiziert, damit ich sie mit dem Label "A", "B", "C", "D" versehen kann,
2. eine neue Variable/Spalte, für die die Differenz "höchster Wert der vier Variablen" minus "zweithöchster Wert der Variablen" numerisch angegeben werden kann.

Es geht dann noch um einiges weiter, aber da komme ich mit which, ifelse etc. alleine klar.

Mir ist so ziemlich egal, ob ich das ganze in zwei Schritten oder in zehn mache, hauptsache, es geht überhaupt...

DANKE für eure Hilfe!
Karen
NeugierundOrga

Re: Identifizierung der Variablen mit dem höchsten Wert

Beitrag von NeugierundOrga »

Noch ein Nachtrag, bin neu und lese mich durchs Forum, den wertvollen Hinweis zu http://bbcodes.de/ würde ich gern weiter verfolgen, nur bekomme ich immer ein fettes forbidden angezeigt. Habt ihr noch andere links, wo ich mir anschauen kann, wie das mit den Codes funktioniert? Danke :-)
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: Identifizierung der Variablen mit dem höchsten Wert

Beitrag von bigben »

Hallo Karen,
aus den gegebenen Variablen diejenige mit dem höchsten Wert identifiziert, damit ich sie mit dem Label "A", "B", "C", "D" versehen kann,
Die Variablen A, B, C und D sind gegeben und Du willst sie jetzt irgendwie noch als A, B, C und D labeln?

kennst Du die Funktionen max() und which.max()?

Hilft Dir im ersten Schritt das hier?

Code: Alles auswählen

A <- round(100*runif(10))
B <- round(100*runif(10))
C <- round(100*runif(10))
D <- round(100*runif(10))

which.max(c(max(A), max(B), max(C), max(D)))

c("A", "B", "C", "D")[which.max(c(max(A), max(B), max(C), max(D)))]
Wenn nicht, dann habe ich die Aufgabe wohl noch nicht verstanden und Du könntest sie vielleicht mit einem Beispiel neu beschreiben.

Teilaufgabe 2 habe ich nicht verstanden. Woher genau soll der zweihöchste Wert kommen?

Zu code-Tags könntest Du in diesen Beitrag hier auf "zitieren" klicken und Dir anschauen, wie ich das oben mit dem Code gemacht habe. Ansonsten kannst Du bbcodes in jede Suchmaschine Deiner Wahl eingeben und wirst etwas finden.

Sind das hier eigentlich Hausaufgaben?

LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
NeugierundOrga

Re: Identifizierung der Variablen mit dem höchsten Wert

Beitrag von NeugierundOrga »

Hallo Bernhard,

danke für Dein schnelle Antwort! Und nein, keine Hausaufgaben, Teil meiner Masterarbeit...

Max() und which.max() ist mir bisher nur im Zusammenhang von Häufigkeits-Abfragen begegnet, bin nicht sicher, ob das passt. Ich muss mich da erstmal reinfuchsen, auch in ein passendes Antwortformat. ;) Auf jeden Fall erstmal danke! Ich komme morgen nochmal darauf zurück!

Vielleicht nochmal eine ausführlichere Beschreibung, auch zum zweiten Teil meiner Frage:
Ich habe ein Modell mit vier verschiedenen Unternehmenskulturen A, B, C, D (die Variablennamen sind komplexer). Die Auswertung und Zusammenfassung von Antworten eines Fragebogens ergibt die Mittelwerte für die Ausprägungen A bis D, das sind meine vier numerischen Variablen (alle zwischen 0 und 100, alle vier aufsummiert ergibt 100, ich habe da also sowas wie prozentuale Anteile). Jetzt geht es darum, die "dominante" Kultur (=mit dem höchsten Wert) zu identifizieren, also muss ich die Variable mit dem höchsten Wert der vier verschiedenen identifizieren. Für spätere Zwecke soll in einer zusätzlichen Variablen einfach nur das Label der entprechenden Variablen hinterlegt werden, damit ich Subgruppen für DominanzA, DominanzB, etc. bilden kann.

Die zweite Aktion ist dann die Stärke der Dominanz zu berechnen, ebenfalls in einer neuen Variable ausgegeben. Dafür muss ich die Differenz des Wertes der dominanten Kultur (höchster Wert der vier Variablen) und dem zweithöchsten Wert innerhalb der vier Variablen bilden.
Ich stelle mir vor, dass ich hier wie oben erstmal die Variable mit dem höchsten Wert, dann die mit dem zweithöchsten identifiziere und dann nur sage nimm den Wert x minus wert y.

LG
Karen
NeugierundOrga

Re: Identifizierung der Variablen mit dem höchsten Wert

Beitrag von NeugierundOrga »

Als Beispiel:
ScreenHunter_333 Aug. 27 16.46.jpg
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: Identifizierung der Variablen mit dem höchsten Wert

Beitrag von bigben »

Ach so, Du willst das pro Reihe machen. Wie wäre es damit?

Code: Alles auswählen

d <- data.frame( A = round(100*runif(10)),
                 B = round(100*runif(10)),
                 C = round(100*runif(10)),
                 D = round(100*runif(10)) )
d$dominant <- apply(d, 1, function(row)
    c("A", "B", "C", "D")[which.max(row)])

print(d)
Wenn gleiche Werte in zwei Spalten stehen, wird hier A vor B vor C vor D ausgesucht, nicht deinem Beispiel folgend NA. Wäre das ein Problem?
Die zweite Aktion ist dann die Stärke der Dominanz zu berechnen, ebenfalls in einer neuen Variable ausgegeben. Dafür muss ich die Differenz des Wertes der dominanten Kultur (höchster Wert der vier Variablen) und dem zweithöchsten Wert innerhalb der vier Variablen bilden.
Man könnte auch sagen, dass Du die vier Werte jeder Reihe der größe nach sortierst und dann die Differenz zwischen erstem und zweitem ausrechnest.

LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
NeugierundOrga

Re: Identifizierung der Variablen mit dem höchsten Wert

Beitrag von NeugierundOrga »

Hallo Bernhard,

großartig, der erste Schritt ist gemacht! Die Funktion habe ich noch vereinfacht, siehe screenshot in Zeile 38, der output ist prima.
Bei gleichen Werten ist die spätere Differenz null (sofern die zweite Identifizierung klappt), das ist als Indikator ausreichend, da noch Kategorien über den Differenzwert gebildet werden.

Somit habe ich jetzt die Variable mit dem höchsten Wert identifiziert. Wie komme ich aber an die zweithöchste und wie kann ich mir den Wert der entsprechenden Spalte anzeigen lassen?
Man könnte auch sagen, dass Du die vier Werte jeder Reihe der größe nach sortierst und dann die Differenz zwischen erstem und zweitem ausrechnest.
Hört sich einfach an, aber ich hänge total...

Eine Differenz berechnen schaff ich dann wieder... :lol:

LG
Karen
ScreenHunter_336 Aug. 28 11.03.jpg
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: Identifizierung der Variablen mit dem höchsten Wert

Beitrag von bigben »

Ich habe gerade keine Zeit. Hilft das hier?

Code: Alles auswählen

> sort(c(4, 3, 1, 2))
[1] 1 2 3 4
> sort(c(4, 3, 1, 2))[3]
[1] 3
Sonst melde ich mich später nochmal.

LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
NeugierundOrga

Re: Identifizierung der Variablen mit dem höchsten Wert

Beitrag von NeugierundOrga »

Hallo Bernhard,

nein, funktioniert leider nicht, sortiert die Daten alle in einer Reihe. Und gibt seltsamerweise auch mehr als 199 (Fälle) x 4 (Variablen) aus, nämlich 811.

In der R-Hilfe zu sort stand, für das Sortieren innerhalb von dataframes sollte man order verwenden. Da hab ich mal etwas rumgestochert, aber da kommt nur Schwachsinn raus (shit in, shit out ist natürlcih auch möglich...) und eben auch eine Listenabfolge von nunmehr weit über tausend Werten

Code: Alles auswählen

> order(data.frame(Skala.OCAIA,Skala.OCAIB,Skala.OCAIC,Skala.OCAID), 
+       na.last = TRUE, decreasing = FALSE, method = c("auto"))
   [1]  260  628   68  416  330  437  302  698   51  670  617  649 1423  639  404  417    1  498  717   79
  [21]  447  324    7  375    9  474 1101  523    3  436  595  227  641  661  464  135  349  370  371  519
  [41] 1006  701  155  106  692  118  427  491  711  564 1113  461  668  674  281  710  419  652  123  362
  
Ich habe in englischsprachigen Foren genau zu meiner Fragestellung (Sortieren einer Reihe von vier Variablen) diese beiden Varianten gefunden, denen ich aber auch planlos gegenüberstehe:

Code: Alles auswählen

# if you wish to sort in decreasing order, defining a function
mysort <- function(x){sort(x, decreasing = TRUE)}
# does the trick:
t(apply(d, 1, FUN = function(x) mysort(x)))

oder

# This is really straight-forward and easy to solve with a simple loop.
s <- x
for(i in 1:NROW(x)) {
  +   s[i,] <- sort(s[i,])
  + }
  
wobei die zweite Variante Buchstaben alphabetisch sortiert hat.

Kannst Du mir weiterhelfen?
DANKE! :)
Karen
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: Identifizierung der Variablen mit dem höchsten Wert

Beitrag von bigben »

So wie Du uns hättest sagen sollen, dass diese Regeln pro Zeile angewandt werden sollen, so musst Du das auch R sagen. In meinem Beispiel oben habe ich das mit apply gemacht. Kennst Du apply? Sonst kann man das auch in einer for-Schleife Reihe für Reihe machen.

Ich denke das hier zeit ganz schön, wie man das mit apply macht und ich denke, das kommt schon recht nah an das, was Du machen willst:

Code: Alles auswählen

d <- data.frame( A = round(20*runif(10)),
                 B = round(20*runif(10)),
                 C = round(20*runif(10)),
                 D = round(20*runif(10)) )

d$dominant <- apply(d[,c("A", "B", "C", "D")], 1, function(row)
  c("A", "B", "C", "D")[which.max(row)])

# Funktionsdefinition: wie sollen die Differenzen pro Reihe gebildet werden
differenz <- function(reihe){
  s <- sort(reihe)
  d <- s[4] - s[3]
  if(d!=0) return(d)
  else return(NaN)
}

# Funktionsanwendung auf jede Reihe
d$differenz <- apply(d[,c("A", "B", "C", "D")], 1, differenz)

# dominant löschen, wo keine Differenz ist
d$dominant <- ifelse(is.nan(d$differenz), yes = NaN, no = d$dominant)

print(d)
LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Antworten