div. Mittelwerte als neue Spalten im gleichen Datensatz

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

Moderatoren: EDi, jogo

Antworten
nulli
Beiträge: 14
Registriert: So Jan 24, 2021 3:34 pm

div. Mittelwerte als neue Spalten im gleichen Datensatz

Beitrag von nulli »

Hallo zusammen,

ich beschäftige mich gerade mit dem Datenhandling (u.a. mit dem Paket dplyr). Eine Sache kriege ich nicht hin und mit meiner bisherigen Suche bin ich auch nicht fündig geworden. Daher hoffe ich, dass ihr mir weiterhelfen könnt :)

Ich möchte: Aus mehreren Fragen div. Mittelwerte bilden und diese als neue Zeile im gleichen Datensatz speichern.
(Optional: Am Schluss die bisherigen Items bzw. Fragen löschen)

Situation: Ich habe einen Fragebogen mit 25 Fragen. Der Fragebogen erfasst ein Konstrukt mit 5 Dimensionen mit je 5 Fragen. Zu jeder Dimension soll ein Mittelwert gebildet werden und ein Gesamtmittelwert für den gesamten Fragebogen.
D.h. ich habe 6 neue Spalten bzw. Variablen. Die Werte sollen weiterhin pro Zeile / Teilnehmer gespeichert werden (für spätere Regression etc.) und die neuen Variablen sollen weiterhin numerisch sein.

In Excel würde ich das z.B. so machen:
Neue Spalte "Dimension1" und pro Zeile/Teilnehmer einen Mittelwert mit der Funktion "=MITTELWERT(P4+R4+T4+V4+X4)".
Neue Spalte "Dimension2" und pro Zeile einen Mittelwert mit der Funktion "=MITTELWERT(...)".
usw...

Wie kann ich so etwas in R machen?
ich habe schon diverse Funktionen wie "summarise, aggregate, convert, mutate, transmute" ausprobiert, aber ich schaffe es einfach nicht :-(

Vielen Dank im Voraus!
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: div. Mittelwerte als neue Spalten im gleichen Datensatz

Beitrag von bigben »

Hallo!

Ich spreche leider kein dplyr, daher zeige ich Dir mal, wie man das ohne macht:

Code: Alles auswählen

bsp <- data.frame(id = LETTERS[1:20], a1 = rep(1, 20), a2 = rep(2, 20),
                  b1 = rep(10,20), b2 = rep(20, 20), b3 = rep(30, 20),
                  c1 = runif(10, 210, 220), c2 = runif(10, 210, 220), c3 = runif(10, 210, 220))
head(bsp)   # der Beispieldatensatz ist sehr eintönig, dafür lässt sich leicht nachrechnen, 
            # ob die Summen nachher stimmen

bsp$a.summe <- rowSums(bsp[2:3], na.rm = FALSE)  # Ansprechen über Spaltennummer
bsp$b.summe <- rowSums(bsp[4:6], na.rm = FALSE)
bsp$c.summe <- rowSums(bsp[c("c1", "c2", "c3")]) # alternativ über Spaltennamen
head(bsp)
HTH,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
nulli
Beiträge: 14
Registriert: So Jan 24, 2021 3:34 pm

Re: div. Mittelwerte als neue Spalten im gleichen Datensatz

Beitrag von nulli »

Hallo Bernhard,

super, vielen Dank für die schnelle Hilfe!

Jetzt habe ich noch eine Frage: Gibt es auch einen Befehl wie man eine Spalte anhand des Spaltennamens wieder löscht?

Da ich 4 Fragebögen in einem Datensatz verwende, würde ich die entsprechende Variable gerne immer konkret ansprechen und ungerne über z.B.:

Code: Alles auswählen

bsp <- bsp[-7]
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: div. Mittelwerte als neue Spalten im gleichen Datensatz

Beitrag von bigben »

Eigentlich würde ich es vermeiden, solche Spalten zu löschen und würde mir stattdessen Kopien anlegen, in denen nur die gewünschten Spalten erhalten bleiben. Erfahrungsgemäß will man auf überschriebene Daten später doch nochmal zugreifen.

Die andere Antwort lautet so:

Code: Alles auswählen

bsp <- data.frame(id = LETTERS[1:20], a1 = rep(1, 20), a2 = rep(2, 20),
                  b1 = rep(10,20), b2 = rep(20, 20), b3 = rep(30, 20),
                  c1 = runif(10, 210, 220), c2 = runif(10, 210, 220), c3 = runif(10, 210, 220))
head(bsp)   

bsp[c("a1", "a2", "c1", "c2", "c3")] <- NULL

head(bsp)
LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
nulli
Beiträge: 14
Registriert: So Jan 24, 2021 3:34 pm

Re: div. Mittelwerte als neue Spalten im gleichen Datensatz

Beitrag von nulli »

Hallo Bernhard,

das hat mir sehr geholfen, vielen Dank!

Ich habe jetzt noch eine Zeile ergänzt: Damit ich auf meine Mittelwerte komme muss ich die Summe ja noch durch die Anzahl der Werte teilen.

Code: Alles auswählen

bsp$c.summe <- rowSums(bsp[c("c1", "c2", "c3")])
bsp$c.mean <- (bsp$c.summe/3) 
bsp[c("c1", "c2", "c3", "c.summe")] <- NULL
Liebe Grüße
Nulli
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: div. Mittelwerte als neue Spalten im gleichen Datensatz

Beitrag von bigben »

Hallo Nulli,

ich hatte übersehen, dass es um Mittelwerte und nicht um Summen geht. In dem Fall möchtest Du vielleicht anstelle der Funktion rowSums auf die Funktion rowMeans zurückgreifen. Die macht zwar zunächst nichts anderes als Du es jetzt händisch gemacht hast, aber die Funktion rowMeans hat ein Argument na.rm das hilfreich werden kann, wenn Leute bei einzelnen Items nichts angekreuzt haben:

Code: Alles auswählen

bsp <- data.frame(a = c(1, 3, 2, 4, 1, 1, 1, NA, 5, 6, NA),
                  b = c(NA, NA, 5, 5, 2, 3, 1, 1, 2, 1, NA))

rowSums(bsp[c("a", "b")]) / 2

rowMeans(bsp[c("a", "b")], na.rm = TRUE)
Wähle mit Bedacht. Wenn häufig NA vorkommen willst Du das vielleicht lieber ausführlich selbst bearbeiten, für ein paar wenige kann rowMeans eine erhebliche Erleichterung sein.

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