Häufigkeiten und Mittelwerte in neuer Spalte zusammenfassen

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

Moderatoren: EDi, jogo

Antworten
gregorboehme1980
Beiträge: 8
Registriert: Di Dez 27, 2022 7:56 pm

Häufigkeiten und Mittelwerte in neuer Spalte zusammenfassen

Beitrag von gregorboehme1980 »

Liebe R-Gemeinde,

Ich habe bei einem Fragebogen zu einer Frage mehrere unterschiedliche Antworten in einer Spalte aufgeführt. Die Personen, die dort geantwortet haben, gehören unterschiedlichen Bereichen an. Von diesen Antworten sollen nun die Mittelwerte (und die Standardabweichung) berechnet und dann aber für die Gesamteinheit zusammengefasst werden.

Code: Alles auswählen

Bsp.: 
Spalte 1     Spalte 2     Spalte 3 
Person A    Bereich A    Wert 2
Person B    Bereich A    Wert 3
Person C    Bereich A    Wert 4
Person D    Bereich B    Wert 4
Person E    Bereich B    Wert 2
...
Ausgegeben werden soll:

Code: Alles auswählen

Spalte 1            Spalte 2                                   Spalte 3
Bereich A         3 (Mittelwert der Antworten)              3 (Anzahl der Personen)
Bereich B         3,5 (Mittelwert der Antworten)           2 (Anzahl der Personen) 
usw.

Ich hoffe das ist verständlich und ihr könnt mir weiterhelfen.

Beste Grüße
Gregor
bigben
Beiträge: 2778
Registriert: Mi Okt 12, 2016 9:09 am

Re: Häufigkeiten und Mittelwerte in neuer Spalte zusammenfassen

Beitrag von bigben »

Vielleicht so?

Code: Alles auswählen

bsp <- data.frame(bereich = rep(c("A", "B", "C"),each = 3),
                  anzahl = sample(0:5, 9, 1))[3:8,]
print(bsp)
#>   bereich anzahl
#> 3       A      2
#> 4       B      2
#> 5       B      0
#> 6       B      0
#> 7       C      2
#> 8       C      0
# Mittelwerte
mw <- aggregate(anzahl ~ bereich, data = bsp, FUN = mean)
print(mw)
#>   bereich    anzahl
#> 1       A 2.0000000
#> 2       B 0.6666667
#> 3       C 1.0000000
# personen = zeilenzahl
zeilen <- aggregate(anzahl ~ bereich, data = bsp, FUN = length)
print(zeilen)
#>   bereich anzahl
#> 1       A      1
#> 2       B      3
#> 3       C      2
# zusammenführen
merge(mw, zeilen, by = "bereich")
#>   bereich  anzahl.x anzahl.y
#> 1       A 2.0000000        1
#> 2       B 0.6666667        3
#> 3       C 1.0000000        2
mit dem Paket data.table:

Code: Alles auswählen

library(data.table)
bsp <- data.table(bereich = rep(c("A", "B", "C"),each = 3),
                  anzahl = sample(0:5, 9, 1))[3:8,]
print(bsp)
#>    bereich anzahl
#> 1:       A      1
#> 2:       B      3
#> 3:       B      1
#> 4:       B      5
#> 5:       C      5
#> 6:       C      0
# Mittelwerte
mw <- bsp[, .(schnitt = mean(anzahl), personen = length(anzahl)), bereich]
print(mw)
#>    bereich schnitt personen
#> 1:       A     1.0        1
#> 2:       B     3.0        3
#> 3:       C     2.5        2
LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
gregorboehme1980
Beiträge: 8
Registriert: Di Dez 27, 2022 7:56 pm

Re: Häufigkeiten und Mittelwerte in neuer Spalte zusammenfassen

Beitrag von gregorboehme1980 »

Vielen Dank erst mal für die schnelle Antwort. Leider komme ich erst jetzt dazu, das ganze mal zu probieren. Der Befehl wird ausgeführt, leider nicht mit den richtigen Ergebnissen.

Leider verstehe ich den Code nicht richtig bzw. kann diesen nicht nachvollziehen. Könntest du vielleicht kurz beschreiben, was mit den den einzelnen Segmenten bewirkt werden soll? Dann könnte ich die ggf. anpassen. Was macht "each" und was versteckt sich hinter den Zahlen bei "sample"?
bigben
Beiträge: 2778
Registriert: Mi Okt 12, 2016 9:09 am

Re: Häufigkeiten und Mittelwerte in neuer Spalte zusammenfassen

Beitrag von bigben »

Hallo Gregor,

Richtige Ergebnisse kann ich gar nicht erzielen, wenn ich die richtigen Daten nicht habe.
gregorboehme1980 hat geschrieben: Mo Jan 02, 2023 12:16 pm Was macht "each" und was versteckt sich hinter den Zahlen bei "sample"?
Da Du zwar ungefähr beschrieben hast, wie die Daten organisiert sein sollen aber selbst keine Daten geliefert hast, habe ich den Zufallsgenerator bemüht, Beispieldaten zu erzeugen, um das weitere Vorgehen zu zeigen.

Code: Alles auswählen

bsp <- data.frame(bereich = rep(c("A", "B", "C"), each = 3),
                  anzahl = sample(0:5, 9, 1))[3:8,]
Mit den dort benutzten Funktionen rep und sample solltest Du Dich im weiteren Verlauf unbedingt auseinander setzen. Für's Erste brauchst Du das nicht im Detail zu verstehen, denn Du sollst das ja mit tatsächlichen Daten mit tatsächlichen Spaltennamen und so weiter umsetzen. Für's Erste kommt da ein kleiner Dataframe heraus, der so aussehen kann (wenn auch jedes Mal mit anderen Zahlen):

Code: Alles auswählen

#>   bereich anzahl
#> 3       A      2
#> 4       B      2
#> 5       B      0
#> 6       B      0
#> 7       C      2
#> 8       C      0
Es gibt also eine Spalte Bereich, in der die Buchstaben A, B und C zur Benennung von Bereichen stehen und eine Spalte anzahl, in der Zufallszahlen stehen. Wie Spalte 2 und Spalte 3 bei Dir wirklich heißen, kann ich ja nicht wissen.

Code: Alles auswählen

# Mittelwerte
Damit kündige ich an, dass ich von hier an zeigen will, wie Du die Mittelwerte von anzahl für jeden der Bereiche bestimmst.

Code: Alles auswählen

mw <- aggregate(anzahl ~ bereich, data = bsp, FUN = mean)
Die Funktion aggregate wird benutzt, um in der Tabelle "bsp" die Anzahl pro Bereich mit der Funktion mean zu aggregieren. Und so sieht man das Ergebnis dieses Funktionsaufrufes:

Code: Alles auswählen

print(mw)
#>   bereich    anzahl
#> 1       A 2.0000000
#> 2       B 0.6666667
#> 3       C 1.0000000
Die Funktion aggregate ist nur eine von vielen Möglichkeiten, Daten in R zu aggregieren. Wenn Du den Eindruk hast, dass sie hier für Dich sinnvoll ist, solltest Du Dich vielleicht mir ihr vertraut machen.

VG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
gregorboehme1980
Beiträge: 8
Registriert: Di Dez 27, 2022 7:56 pm

Re: Häufigkeiten und Mittelwerte in neuer Spalte zusammenfassen

Beitrag von gregorboehme1980 »

Okay. Ich habe einfach mal einen Auszug aus der zu bearbeitenden Datei hochgeladen (siehe Anhang). Das sind dann die Werte (ein Teil davon), die ich umgruppieren muss

Dort sind die einzelnen Bereiche (AO01 - AO14) aufgelistet mit den jeweiligen Mittelwerten für zwei Beispielskalen. Ich brauche jetzt eine Übersicht die in der ersten Spalte den Namen des Bereiches enthält (AO01 bspw.).In der zweiten Spalte sollte dann stehen, wie viele Antworten (im Endeffekt Zeilen) zu diesem Bereich gehören (bei AO01 wäre das z.B. 126, AO02 24 usw. - das bekommt man ja mit dem Table-Befehl relativ leicht raus)

Code: Alles auswählen

AO01 AO02 AO03 AO04 AO05 AO06 AO07 AO08 AO09 AO10 AO11 AO12 AO13 AO14 
 126   24  196  100  225  512   35  156  202   65  148  309   22   22 
und in der dritten bzw. vierten Spalte der Mittelwert für die jeweiligen Antworten für den Bereich. So müsste das aussehen (hab ich jetzt einfach mal in Excel berechnet):

Code: Alles auswählen

Bereich       Anzahl    Mittelwert_Vollständigkeit    Mittelwert_Arbeitszeit
AO01          126           2,8                                      1,4
AO02          24             3,1                                      1,5
Und diese Tabelle bekomme ich leider nicht hin und verstehe auch die obigen Hinweise leider nicht so richtig. Sorry, aber trotzdem schon mal ein ganz großes Dankeschön für die Bemühungen, mir zu helfen.

Beste Grüße
Gregor
Daten_ausgewählt.xlsx
(40.51 KiB) 46-mal heruntergeladen
gregorboehme1980
Beiträge: 8
Registriert: Di Dez 27, 2022 7:56 pm

Re: Häufigkeiten und Mittelwerte in neuer Spalte zusammenfassen

Beitrag von gregorboehme1980 »

Könnte noch mal jemand schauen, ob er mir behilflich sein kann? Ich komme nicht wirklich weiter mit meiner Fragestellung.

Schöne Grüße
Gregor
bigben
Beiträge: 2778
Registriert: Mi Okt 12, 2016 9:09 am

Re: Häufigkeiten und Mittelwerte in neuer Spalte zusammenfassen

Beitrag von bigben »

Hallo Gregor,

wenn Du eine Antwort nicht verstehst aber auch nicht eingrenzt, was Du nicht verstehst, dann ist es schwer, weitere Antworten zu geben. Wir können ja nicht wissen, was Du nicht verstehst und deshalb auch keine Rückschlüsse für spätere Antworten ziehen.

Dann hoffe ich mal, dass das hier verständlicher/hilfreicher ist:

Code: Alles auswählen

library(readxl)   

d <- read_xlsx(path = "C:\\Users\\bigben\\Downloads\\Daten_ausgewählt.xlsx")

# Anzahl der Einträge pro Bereich

table(d$Bereich)
#> 
#> AO01 AO02 AO03 AO04 AO05 AO06 AO07 AO08 AO09 AO10 AO11 AO12 AO13 AO14 
#>  126   24  196  100  225  512   35  156  202   65  148  309   22   22

# Mittelwert Mean_Vollständigkeit pro Bereich

aggregate(Mean_Vollständigkeit ~ Bereich, data = d, FUN = mean)
#>    Bereich Mean_Vollständigkeit
#> 1     AO01             2.835979
#> 2     AO02             3.111111
#> 3     AO03             2.719388
#> 4     AO04             3.240000
#> 5     AO05             3.047407
#> 6     AO06             3.180990
#> 7     AO07             3.447619
#> 8     AO08             2.816239
#> 9     AO09             3.277228
#> 10    AO10             3.276923
#> 11    AO11             3.110360
#> 12    AO12             3.228695
#> 13    AO13             2.469697
#> 14    AO14             3.348485

# Mittelwert Mean_Belastende... pro Bereich

aggregate(Mean_Belastende_Arbeitszeit ~ Bereich, data = d, FUN = mean)
#>    Bereich Mean_Belastende_Arbeitszeit
#> 1     AO01                    1.383598
#> 2     AO02                    1.500000
#> 3     AO03                    1.671769
#> 4     AO04                    1.476667
#> 5     AO05                    1.457778
#> 6     AO06                    1.444010
#> 7     AO07                    1.704762
#> 8     AO08                    1.760684
#> 9     AO09                    1.427393
#> 10    AO10                    1.256410
#> 11    AO11                    1.511261
#> 12    AO12                    1.603020
#> 13    AO13                    1.590909
#> 14    AO14                    1.636364


# In einem Satz alles zusammen, damit ein gemeinsamer data frame herauskommt:

cbind(table(d$Bereich),
      aggregate(Mean_Belastende_Arbeitszeit ~ Bereich, data = d, FUN = mean),
      aggregate(Mean_Belastende_Arbeitszeit ~ Bereich, data = d, FUN = mean))
#>    Var1 Freq Bereich Mean_Belastende_Arbeitszeit Bereich
#> 1  AO01  126    AO01                    1.383598    AO01
#> 2  AO02   24    AO02                    1.500000    AO02
#> 3  AO03  196    AO03                    1.671769    AO03
#> 4  AO04  100    AO04                    1.476667    AO04
#> 5  AO05  225    AO05                    1.457778    AO05
#> 6  AO06  512    AO06                    1.444010    AO06
#> 7  AO07   35    AO07                    1.704762    AO07
#> 8  AO08  156    AO08                    1.760684    AO08
#> 9  AO09  202    AO09                    1.427393    AO09
#> 10 AO10   65    AO10                    1.256410    AO10
#> 11 AO11  148    AO11                    1.511261    AO11
#> 12 AO12  309    AO12                    1.603020    AO12
#> 13 AO13   22    AO13                    1.590909    AO13
#> 14 AO14   22    AO14                    1.636364    AO14
#>    Mean_Belastende_Arbeitszeit
#> 1                     1.383598
#> 2                     1.500000
#> 3                     1.671769
#> 4                     1.476667
#> 5                     1.457778
#> 6                     1.444010
#> 7                     1.704762
#> 8                     1.760684
#> 9                     1.427393
#> 10                    1.256410
#> 11                    1.511261
#> 12                    1.603020
#> 13                    1.590909
#> 14                    1.636364
HTH,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
gregorboehme1980
Beiträge: 8
Registriert: Di Dez 27, 2022 7:56 pm

Re: Häufigkeiten und Mittelwerte in neuer Spalte zusammenfassen

Beitrag von gregorboehme1980 »

HTH,
Bernhard
Hat es! Vielen, vielen Dank, du hast mir sehr geholfen. Jetzt funktioniert es und ich kann es nachvollziehen.

Beste Grüße
Gregor
bigben
Beiträge: 2778
Registriert: Mi Okt 12, 2016 9:09 am

Re: Häufigkeiten und Mittelwerte in neuer Spalte zusammenfassen

Beitrag von bigben »

Sehr schön: Mein persönliches Fazit: Wieder einmal ein Beispiel, dass man solche Fragen mit konkreten Beispieldaten stellen sollte :D

LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
gregorboehme1980
Beiträge: 8
Registriert: Di Dez 27, 2022 7:56 pm

Re: Häufigkeiten und Mittelwerte in neuer Spalte zusammenfassen

Beitrag von gregorboehme1980 »

Unbedingt. Auch ein Lerneffekt für mich. Beim nächsten Mal von Anfang an. Versprochen. :)

Schöne Grüße
Gregor
Antworten