Lösung gesucht

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

Moderatoren: EDi, jogo

wbart
Beiträge: 89
Registriert: Fr Mär 16, 2018 4:08 pm

Lösung gesucht

Beitrag von wbart »

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
Dateianhänge
Testtabelle.xlsx
(11.62 KiB) 55-mal heruntergeladen
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: Lösung gesucht

Beitrag von bigben »

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.

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)
Wenn Du Probleme hast, das zu vervollständigen, dann schreib bitte, woran es hängt.


LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
wbart
Beiträge: 89
Registriert: Fr Mär 16, 2018 4:08 pm

Re: Lösung gesucht

Beitrag von wbart »

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
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: Lösung gesucht

Beitrag von bigben »

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

Re: Lösung gesucht

Beitrag von jogo »

Und weil ich data.table so mag, kommt hier die entsprechende data.table-Version:

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][]
Gruß, Jörg
wbart
Beiträge: 89
Registriert: Fr Mär 16, 2018 4:08 pm

Re: Lösung gesucht

Beitrag von wbart »

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
Benutzeravatar
EDi
Beiträge: 1599
Registriert: Sa Okt 08, 2016 3:39 pm

Re: Lösung gesucht

Beitrag von EDi »

Einfacher fände ich es schon wenn immer die selbe Strategie angewendet würde.
Dann schau dir mal dplyr an. Ausdrucksvollere Syntax als data.table, aber langsamer und nicht zwingend besser zu verstehen.
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
Bild.
Athomas
Beiträge: 768
Registriert: Mo Feb 26, 2018 8:19 pm

Re: Lösung gesucht

Beitrag von Athomas »

Einfacher fände ich es schon wenn immer die selbe Strategie angewendet würde.
Bevor wir in eine Strategiediskussion einsteigen, sollten wir erstmal nach dem tieferen Sinn Deiner Berechnungen fragen!?
Unter anderem werden da Standardabweichungen von Mittelwerten berechnet - bist Du Dir sicher, dass Du das wissen willst?
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: Lösung gesucht

Beitrag von bigben »

Hallo wbart,
wbart hat geschrieben: So Mai 06, 2018 11:50 amJa 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.
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
Benutzeravatar
EDi
Beiträge: 1599
Registriert: Sa Okt 08, 2016 3:39 pm

Re: Lösung gesucht

Beitrag von EDi »

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).
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 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
Bild.
Antworten