Hallo doppelhaushaelfte,
doppelhaushaelfte97 hat geschrieben:Ich habe das trotzdem versucht, nett und freundlich auszudrücken
Mir geht es genauso und ich hatte etwas Angst, Dich mit meinen Äußerungen verschreckt zu haben.
Und ja, ich komme mit dem R-Code in der Praxis zurecht und er tut auch, was er soll.
Das freut mich, denn das ist ja das Wesentliche.
Zu deinem R-Code: Wie gesagt, ich bin relativ neu hier und verstehe ihn theoretisch noch nicht so ganz.
Das ist völlig ok und ich will gerne eine Erklärung versuchen. Du müsstest mir dann aber kurz zurückmelden, ob ich zuviel oder zuwenig R voraussetze. Im Allgemeinen verstehen wir uns hier als Statistikforum und nicht als R Programmierforum. Sollte es mehr Fragen zum Umgang mit R, der Syntax oder dem Zeichnen von Diagrammen gehen bin ich und sind andere Hilfsbereite auf forum.r-statistik.de zu erreichen.
Aaaalso: Ich habe die Beispieldaten ja in einem Dataframe zeilenweise untergebracht. Die Funktion apply benutzt man, um eine Auswertefunktion der Reihe nach auf alle Zeilen anzuwenden. apply kann noch mehr, aber die "1" im Aufruf bedeutet, dass ich sie für zeilenweise Auswertungen nutzen möchte. apply braucht neben der "1" natürlich noch die auszuwertenden Daten, hier "gewichte" und die Funktion, die auf alle diese Zeilen angewendet werden soll. Hier muss ich eine Funktion übergeben, die aus je einer Zeile ein Ergebnis berechnet. Klassischerweise definiert man so eine Funktion mit dem Kommande "function(x)", alternativ geht das neuerdings auch mit "\(x)". Gerade innerhalb von apply Aufrufen ist die kürzere Form lesbarer. Was soll nun also unsere Funktion tun? Sie soll für jede Zeile bestehend aus fünf Werten einen gewichteten Mittelwert berechnen und das macht die Funktion "weighted.mean". Sie braucht einmal die Werte aus denen sie die Mittelwerte bilden soll und dann einmal die Gewichte. Die Werte, aus denen die Mittelwerte gebildet werden sollen sind die Zahlen von 1 bis 5, hier geschrieben als "1:5". Die Gewichte sind die Zahlenwerte in der Zeile, hier also "x".
Ist das soweit verständlich? Damit sind hoffentlich folgende Fragen jetzt klar:
Kannst du mir erklären, was das \(x) in apply macht
Das definiert eine anonyme Funktion von x. Das kennst Du wahrscheinlich eher als "function(x)".
w=x auswählst und was dann x in diesem Kontext ist?
"w" ist der Argumentname der Funktion "weighted.mean" für die Gewichte. x steht der Reihe nach für jede dieser Zeilen. Außerdem hat die Funktion weighted.mean selbst noch ein Argument für die Werte, aus denen der Mittelwert berechnet werden soll. Dass das auch x heißt ist hier leider verwirrend und führt wahrscheinlich zu dieser Frage:
Ist x jetzt hier das \(x) oder das x innerhalb der Funktion vom weighted.mean? Oder ist es beides mal dasselbe?
Mit "\(x)" definiere ich, dass die an die Funktion übergebenen Daten innerhalb der Funktion "x" heißen und dieses x setze ich in die Funktion "weighted.mean" als deren Gewichte ein, daher "w = x". Es wäre wohl weniger verwirrend gewesen hätte ich gleichwertig geschrieben:
- Code: Alles auswählen
computerrating <- apply(gewichte, 1, \(zeile) weighted.mean(x = 1:5, w = zeile))
# oder
computerrating <- apply(gewichte, 1, function(zeile) weighted.mean(x = c(1, 2, 3, 4, 5), w = zeile))
Ist es so klarer?
Und kann ich den weighted.mean bspw. auch nur über Spalten 1-4 erstellen? Wie schließe ich denn dann im R-Code die 5.Spalte aus?
Unsere anonyme Funktion erhält ja alle fünf Werte jeder Zeile in einem Vektor übergeben, den wir "x" nennen. Wenn Du nur die ersten vier Werte von "x" verwenden möchtest, kannst Du das mit eckigen Klammern ausdrücken. Die ersten vier Werte aus "x" heißen "x[1:4]". Oder Du sagst, dass Du den fünften Wert in "x" weglassen willst. Das heißt dann "x[-5]". In der neuen Schreibweise "zeile[1:4]" oder "zeile[-5]". Das kannst Du machen, wie Du willst. Eine zweite Änderung ist noch erforderlich: Du willst ja jetzt nicht mehr einen gewichteten Mittelwert der Zahlen eins bis fünf, sondern nur noch der Zahlen eins bis vier berechnen.
Versuch es doch mit diesen Erklärungen selbst umzusetzen. Wenn es klappt, hast Du alles verstanden. Wenn nicht, schreibe ich Dir das gerne auf die ersten vier Spalten um.
HTH,
Bernhard