Lösung gesucht
Lösung gesucht
Hallo,
Ich habe häufig eine bestimmte Datenstruktur mit der ich ganz simple Sachen machen möchte. Ich bin vielleicht zu verexcelt aber auf jeden Fall ertrinke ich in Fehlermeldungen und aufwendigen Lösungsvarianten. Vielleicht könnte mir jemand ein elegantes Lösungsscript schreiben, dann könnte ich mich vielleicht Rückwärts zum Verständnis durchhangeln. Ich habe eine Beispieldatei mit den Berechnungen in Excel beigefügt.
Im wesentlichen versuche ich nur aus einer Tabelle mit Wiederholungswerten den Mittelwert, die Standardabweichung und den Variationskoeffizienten zu berechnen. Danach möchte ich diese anhand der Gruppen ebenfalls mit Mittelwert, Standardabweichung und Variationskoeffizient zusammenfassen.
Das kann doch so aufwendig gar nicht sein.
Ich hoffe ein bisschen auf euer Verständnis, ich bin noch absoluter Neuling.
Gruß
Wbart
Ich habe häufig eine bestimmte Datenstruktur mit der ich ganz simple Sachen machen möchte. Ich bin vielleicht zu verexcelt aber auf jeden Fall ertrinke ich in Fehlermeldungen und aufwendigen Lösungsvarianten. Vielleicht könnte mir jemand ein elegantes Lösungsscript schreiben, dann könnte ich mich vielleicht Rückwärts zum Verständnis durchhangeln. Ich habe eine Beispieldatei mit den Berechnungen in Excel beigefügt.
Im wesentlichen versuche ich nur aus einer Tabelle mit Wiederholungswerten den Mittelwert, die Standardabweichung und den Variationskoeffizienten zu berechnen. Danach möchte ich diese anhand der Gruppen ebenfalls mit Mittelwert, Standardabweichung und Variationskoeffizient zusammenfassen.
Das kann doch so aufwendig gar nicht sein.
Ich hoffe ein bisschen auf euer Verständnis, ich bin noch absoluter Neuling.
Gruß
Wbart
- Dateianhänge
-
- Testtabelle.xlsx
- (11.62 KiB) 56-mal heruntergeladen
Re: Lösung gesucht
Hallo!
Hilft Dir das hier für den Anfang? Du musst Dir ein paar Gedanken darüber machen, wie Du mit den NA umgehen willst. Meines Wissens werden die von Excel einfach ignoriert, das habe ich nachzuahmen versucht.
Wenn Du Probleme hast, das zu vervollständigen, dann schreib bitte, woran es hängt.
LG,
Bernhard
Hilft Dir das hier für den Anfang? Du musst Dir ein paar Gedanken darüber machen, wie Du mit den NA umgehen willst. Meines Wissens werden die von Excel einfach ignoriert, das habe ich nachzuahmen versucht.
Code: Alles auswählen
werte <- read.table(header= TRUE, dec=",", text =
"Name Wert_1 Wert_2 Wert_3
a 432,50 105,00 289,00
a 571,00 170,50 239,00
a 352,00 106,00 133,00
b 378,50 119,00 207,00
b NA 90,00 228,00
b 338,50 71,00 228,00
a 446,00 94,00 189,00
a 482,00 90,00 129,00
a 287,50 110,00 117,00
c 593,00 153,00 240,00
c 409,50 114,00 126,00
c NA 94,00 245,00
a 260,50 76,50 179,00
a 490,00 79,00 202,00
a 527,00 65,50 274,00
d 614,00 79,00 105,00
d 549,00 106,50 235,00
d 563,00 102,00 250,00
a 485,00 NA 265,00
a 512,00 112,00 142,00
a 407,50 92,00 203,00
e 631,50 126,00 218,00
e 791,00 130,50 208,00
e 432,50 88,00 237,00
")
print(str(werte))
werte$mw.reihen <- rowMeans(werte[,2:4], na.rm = TRUE)
werte$sd.reihen <- apply(werte[,2:4], 1, function(x) sd(x, na.rm=TRUE))
werte$var.koeff <- with(werte, sd.reihen/mw.reihen*100)
print(str(werte))
mw.a <- mean(unlist(werte[werte$Name=="a", "mw.reihen"]), na.rm=TRUE)
mw.b <- mean(unlist(werte[werte$Name=="b", "mw.reihen"]), na.rm=TRUE)
mw.c <- mean(unlist(werte[werte$Name=="c", "mw.reihen"]), na.rm=TRUE)
mw.d <- mean(unlist(werte[werte$Name=="d", "mw.reihen"]), na.rm=TRUE)
mw.e <- mean(unlist(werte[werte$Name=="a", "mw.reihen"]), na.rm=TRUE)
print(mw.a)
LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Re: Lösung gesucht
Hallo Bernhard,
vielen Dank für deine Mühe. Allein die Erwähnung von rowmean ist Gold Wert. Ich weiß nicht warum dieser Befehl bisher noch nirgends aufgetaucht ist. Er erscheint mir ziemlich essentiell.
VG und einen schönen Tag noch
Werner
vielen Dank für deine Mühe. Allein die Erwähnung von rowmean ist Gold Wert. Ich weiß nicht warum dieser Befehl bisher noch nirgends aufgetaucht ist. Er erscheint mir ziemlich essentiell.
VG und einen schönen Tag noch
Werner
Re: Lösung gesucht
Hallo,
bitte beachte die Großschreibung: nicht rowmean sondern rowMeans. Der Befehl ist oft sehr nützlich, er ist aber nicht erforderlich. Du kannst ihn durch einen Aufruf von mean mit apply ersetzen, so wie ich das mit sd gemacht habe. Das ist etwas länger, aber viel flexibler. R hat eine große Menge solcher convenience-Funktionen, wichtiger ist es, die vielseitigen Funktionen, also beispielsweise apply und den Umgang mit eckigen Klammern, zu lernen.
LG,
Bernhard
bitte beachte die Großschreibung: nicht rowmean sondern rowMeans. Der Befehl ist oft sehr nützlich, er ist aber nicht erforderlich. Du kannst ihn durch einen Aufruf von mean mit apply ersetzen, so wie ich das mit sd gemacht habe. Das ist etwas länger, aber viel flexibler. R hat eine große Menge solcher convenience-Funktionen, wichtiger ist es, die vielseitigen Funktionen, also beispielsweise apply und den Umgang mit eckigen Klammern, zu lernen.
LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Re: Lösung gesucht
Und weil ich data.table so mag, kommt hier die entsprechende data.table-Version:
Gruß, Jörg
Code: Alles auswählen
werte <- read.table(header= TRUE, dec=",", text =
"Name Wert_1 Wert_2 Wert_3
a 432,50 105,00 289,00
a 571,00 170,50 239,00
a 352,00 106,00 133,00
b 378,50 119,00 207,00
b NA 90,00 228,00
b 338,50 71,00 228,00
a 446,00 94,00 189,00
a 482,00 90,00 129,00
a 287,50 110,00 117,00
c 593,00 153,00 240,00
c 409,50 114,00 126,00
c NA 94,00 245,00
a 260,50 76,50 179,00
a 490,00 79,00 202,00
a 527,00 65,50 274,00
d 614,00 79,00 105,00
d 549,00 106,50 235,00
d 563,00 102,00 250,00
a 485,00 NA 265,00
a 512,00 112,00 142,00
a 407,50 92,00 203,00
e 631,50 126,00 218,00
e 791,00 130,50 208,00
e 432,50 88,00 237,00")
library("data.table")
setDT(werte)
Spalten <- names(werte)[-1]
werte[, ':='(mw=rowMeans(.SD, na.rm=TRUE), s=apply(.SD, 1, sd, na.rm=TRUE)), .SDcols=Spalten]
werte[, varKo:=s/mw][]
werte[, .(MW=mean(mw), S=sd(mw)), Name][, VK:=S/MW][]
Re: Lösung gesucht
Hallo,
Ja ich war auch ein bisschen irritiert, das man für so ähnliche Aufgaben (Berechne x, y, z zeilenweise), so unterschiedliche Strategien benutzen muss. Einfacher fände ich es schon wenn immer die selbe Strategie angewendet würde. Da klingt jetzt data.table auch sehr interessant wenn auch noch sehr kryptisch. Die apply Varianten habe ich noch nicht wirklich verstanden. Aber ihr habt mir hier schon mal den Umgang mit Listen und apply ans Herz gelegt. Ich arbeite drann . Vielen Dank für eure Anregungen.
Gruß
Werner
Ja ich war auch ein bisschen irritiert, das man für so ähnliche Aufgaben (Berechne x, y, z zeilenweise), so unterschiedliche Strategien benutzen muss. Einfacher fände ich es schon wenn immer die selbe Strategie angewendet würde. Da klingt jetzt data.table auch sehr interessant wenn auch noch sehr kryptisch. Die apply Varianten habe ich noch nicht wirklich verstanden. Aber ihr habt mir hier schon mal den Umgang mit Listen und apply ans Herz gelegt. Ich arbeite drann . Vielen Dank für eure Anregungen.
Gruß
Werner
Re: Lösung gesucht
Dann schau dir mal dplyr an. Ausdrucksvollere Syntax als data.table, aber langsamer und nicht zwingend besser zu verstehen.Einfacher fände ich es schon wenn immer die selbe Strategie angewendet würde.
Bitte immer ein reproduzierbares Minimalbeispiel angeben. Meinungen gehören mir und geben nicht die meines Brötchengebers wieder.
Dieser Beitrag ist lizensiert unter einer CC BY 4.0 Lizenz
.
Dieser Beitrag ist lizensiert unter einer CC BY 4.0 Lizenz
.
Re: Lösung gesucht
Bevor wir in eine Strategiediskussion einsteigen, sollten wir erstmal nach dem tieferen Sinn Deiner Berechnungen fragen!?Einfacher fände ich es schon wenn immer die selbe Strategie angewendet würde.
Unter anderem werden da Standardabweichungen von Mittelwerten berechnet - bist Du Dir sicher, dass Du das wissen willst?
Re: Lösung gesucht
Hallo wbart,
LG,
Bernhard
Es gibt in R meistens sehr viele Wege, zu einem Ziel zu kommen. Das da oben war meine Auswahl für einen, der damit R lernen will. Einerseits hast Du Dich ja gefreut, die Funktion rowMeans kennen zu lernen, andererseits ist sie natürlich der Inbegriff eines one-trick-ponys. Du kannst entweder Spezialfunktionen wie rowMeans anwenden oder alles mit vielseitigen Funktionen machen, beides gleichzeitig ist schwer. Für mich selbst hätte ich es wahrscheinlich nochmal anders gelöst. Data.table und dplyr kommen hat wieder mit ganz eigenen Sprachelementen, die nur bedingt als "R" zu beschreiben sind und ich weiß nicht genau, was passiert, wenn Du versuchst, beide miteinander zu kombinieren (wenn Dir z. B. ein data.table- und ein dplyr-Schüler beide Hilfe bei zwei Problemen mit demselben Datensatz leisten).
LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Re: Lösung gesucht
Ich fühle mich gerade auch als Wanderer zwischen den Welten und habe dabei manchmal meine Probleme. Einerseits mag ich dplyr, weil es mit recht ausdrucksvoll, schnell runterzuschreiben, die Integration mit DB sehr sehr praktisch und der data.frame (mit list-cols) die Einheit ist. Andererseits sind einige Probleme nur unglaublich hässlich lösbar (oder ich bin noch zu wenig im tidyverse drin) und sehr unperformant (im Vergleich zu matrix Algebra oder data.table).Data.table und dplyr kommen hat wieder mit ganz eigenen Sprachelementen, die nur bedingt als "R" zu beschreiben sind und ich weiß nicht genau, was passiert, wenn Du versuchst, beide miteinander zu kombinieren (wenn Dir z. B. ein data.table- und ein dplyr-Schüler beide Hilfe bei zwei Problemen mit demselben Datensatz leisten).
data.table ist schnell und löst mehr Probleme einfacher für mich (wobei man die Syntax drauf haben muss). List-cols (mache viel mit simulationen und Auswertungen pro Gruppe, wo diese handlich sind)vund rechnen auf der DB fehlen mir aber.
Ich wechsle zwischen beiden hin und her, wobei ich das Gefühl haben, das der Mix nicht zur verständlichkeit meines Codes beiträgt. Mal schauen wo ich nächstes Jahr bin. Ich vermute eher beim tidyverse als default und data.table für die Sonderfälle wo ich das Maximum von R brauche.
Bitte immer ein reproduzierbares Minimalbeispiel angeben. Meinungen gehören mir und geben nicht die meines Brötchengebers wieder.
Dieser Beitrag ist lizensiert unter einer CC BY 4.0 Lizenz
.
Dieser Beitrag ist lizensiert unter einer CC BY 4.0 Lizenz
.