Neuer Datensatz aus "For-Schleife"

Allgemeine Statistik mit R, die Test-Methode ist noch nicht bekannt, ich habe noch keinen Plan!

Moderatoren: EDi, jogo

Isegrimm
Beiträge: 14
Registriert: Mo Mär 16, 2020 9:52 am

Neuer Datensatz aus "For-Schleife"

Beitrag von Isegrimm »

Hallo zusammen ...

Ich bin blutiger Anfänger in "R" und hangele mich derzeit mit Tutorials und Videos aus dem Internet durch. Derzeit mache ich noch alle Aufgaben in Statistik mit Excel (oder Libreoffice) ... aber das ist mir - schon aus Lizenzgründen - auf die Dauer zu doof, zumal ich seit Jahrzehnten Linuxer bin. :)

Zu meinem Problem:

Ich erzeuge aus einer Datenbank eine csv-Datei mit berechneten Mittelwerten einer Abfrage (
Beispiel.csv
(5.14 KiB) 479-mal heruntergeladen
). Diese Datei wird für ein Kalenderjahr gezogen und enthält daher in einige Zeilen komplett Nullwerte. (Ereignis hat noch nicht stattgefunden).

(Ich habe aus der Beispieldatei alle unwichtigen Spalten entfernt, die Anzahl der Zeilen gekürzt (es sind sonst 10x so viel und ändert sich ... wie oben erwähnt) und die Spalten umbenannt (aus Datenschutzgründen). Das "Merkmal" hat normalerweise noch eine individuelle Kennung, aber ich habe es hier schon geschafft, das mit der Funktion:

Code: Alles auswählen

beispiel$merkmal <- substr(beispiel$merkmal, 1, 3)
... auf die drei linken Zeichen zu kürzen. :D )


Ich möchte nun - abhängig vom Merkmal in Spalte 1 - den Mittelwert für jedes Kriterium abhängig von jedem Merkmal bilden. Prinzipiell bedeutet das, dass eine Funktion alle Zeilen die in allen Kriterien einen Nullwert haben, löscht, da sie bei der Mittelwertberechnung den Wert verfälschen würden.

Danach möchte ich den Mittelwert - z.B. des Merkmals "320" - für jedes der vier Kriterien über die gesamte Tabelle hinweg ermitteln und in einen neuen Dataframe schreiben.

Das heißt, es soll ein Dataframe entstehen, der in der ersten Spalte jeweils nur einmal das Merkmal enthält und in den nachfolgenden 4 Spalten jeweils die Mittelwerte für die 4 Merkmale.

Dieser Dataframe soll dann der Ausgang für einen Barplot sein ... eher 4 Barplots.

--------------------------

Ich würde jetzt gerne ein Minimalbeispiel anfügen, aber ich weiß noch nicht mal, wie ich anfangen soll. Ich möchte nun nicht, dass jemand von Euch mir das Skript schreibt, sondern mir einen Schubs in die richtige Richtung zeigt.

Ich möchte - soweit das möglich ist - alle Schritte in R machen und die Tabelle nicht vorher in Libreoffice erst "aufbereiten".

1. Wie schaffe ich es, die Zeilen zu löschen, die in allen Spalten (Kriterium 1 - 4) Nullwerte enthalten?

2. Wie kann ich (Meine Vorstellung wäre mit einer "For-Schleife") die einzelnen Mittelwerte berechnen?

Schon mal Danke im Voraus

Stefan
Benutzeravatar
student
Beiträge: 747
Registriert: Fr Okt 07, 2016 9:52 am

Re: Neuer Datensatz aus "For-Schleife"

Beitrag von student »

Hallo Stefan,

hier eine Anregung:

Code: Alles auswählen

Daten <- read.csv2("Beispiel.csv")

# Dataframe aufarbeiten und anzeigen:
Daten$Merkmal <- as.character(Daten$Merkmal)
rownames(Daten) <- Daten$Merkmal
View(Daten)

# Null-Beobachtungen auf Basis des 1. Kriterium entfernen:
Daten_bereinigt <- subset(Daten, Daten$Kriterium.1 != 0)
View(Daten_bereinigt)

# Mittelwert für jede Zeile berechnen:
Mittelwerte <- as.data.frame(Merkmal = Daten_bereinigt$Merkmal,
                             rowMeans(Daten_bereinigt[2:5]))

# Dataframe anzeigen:
View(Mittelwerte)
Viele Grüße,
Student
-----------------------------------------------------------------------------------------------------------------------
faes.de, Datenanalyse mit R & das Ad-Oculos-Projekt
Das Ad-Oculos-Projekt auf YouTube

Habe Mut, dich deines eigenen Verstandes zu bedienen! (Kant)
Athomas
Beiträge: 776
Registriert: Mo Feb 26, 2018 8:19 pm

Re: Neuer Datensatz aus "For-Schleife"

Beitrag von Athomas »

Ich bin inzwischen so data.table-verstrahlt, dass ich das Problem im Ur-R gar nicht mehr in angemessener Zeit hinbekommen habe :) !
Deshalb noch eine data.table-Variante (viel Spaß beim Nachvollziehen - ich meine aber, es lohnt sich für Dauer-R-User):

Code: Alles auswählen

library(data.table)

Rohdaten  <- fread("http://forum.r-statistik.de/download/file.php?id=1918", sep=";", dec=",")
nichtNull <- Rohdaten[rowSums(Rohdaten[  , !"Merkmal"] != 0) != 0, ]
Ergebnis  <- nichtNull[, lapply(.SD, mean), by = Merkmal]

setorder(Ergebnis, Merkmal)
Hier wird auch der Mittelwert von "Gesamt" gebildet - den Du wohl gar nicht willst!?
Aber den kriegt man leicht weg :) !
bigben
Beiträge: 2894
Registriert: Mi Okt 12, 2016 9:09 am

Re: Neuer Datensatz aus "For-Schleife"

Beitrag von bigben »

Hallo Isegrimm,

ich bin nicht ganz sicher, wie die Aufgabe zu verstehen ist. Du schreibst:
Isegrimm hat geschrieben: Fr Nov 01, 2024 2:15 pmIch möchte nun - abhängig vom Merkmal in Spalte 1 - den Mittelwert für jedes Kriterium abhängig von jedem Merkmal bilden.
Ich würde das so verstehen, dass aus all den Zeilen, in denen Merkmal vorkommt die Spalte3 Kategorie.3 gemittelt werden soll.

In students Code lese ich, dass er aus jeder Zeile einzeln einen Mittelwert aus den vier Kategorien rechnet.

Demnach haben Student und ich die Aufgabe unterschiedlich verstanden und vielleicht magst Du Sie nochmal konkretisieren?

@student: Dein Code läuft bei mir nicht mit einer Fehlermeldung wie folgt

Code: Alles auswählen

rownames(Daten) <- Daten$Merkmal
Fehler in `.rowNamesDF<-`(x, value = value) : 
  doppelte 'row.names' nicht zulässig
LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Benutzeravatar
student
Beiträge: 747
Registriert: Fr Okt 07, 2016 9:52 am

Re: Neuer Datensatz aus "For-Schleife"

Beitrag von student »

Hallo Bernhard,

habe ich bekommen, aber R scheint "fehlertolerant" zu sein. Was auch angemeckert wird, ist das Auftreten von mehrfachen Merkmalsbezeichnungen.

Ich lasse aber gerne noch Freiraum zur eigenen Kreativität des Anfragenden! 8-)
Viele Grüße,
Student
-----------------------------------------------------------------------------------------------------------------------
faes.de, Datenanalyse mit R & das Ad-Oculos-Projekt
Das Ad-Oculos-Projekt auf YouTube

Habe Mut, dich deines eigenen Verstandes zu bedienen! (Kant)
Isegrimm
Beiträge: 14
Registriert: Mo Mär 16, 2020 9:52 am

Re: Neuer Datensatz aus "For-Schleife"

Beitrag von Isegrimm »

Erstmal Danke an "student" und "Athomas" ...

Bei dem Code von "student" gab es Fehlermeldungen, die ich jetzt nicht interpretieren konnte ... aber ich werde das nochmal durchspielen und versuchen rauszukriegen, woran es lag.

Der Code von "Athomas" hat's gebracht ... und jetzt muss ich mich erst mal durchhangeln, was die Befehle alles und wie bedeuten (so vom Lerneffekt her :) ). Ich hab jetzt noch eine Rundung eingebaut und den Pfad der Datei auf meinen Projektpfad angepasst:

Code: Alles auswählen

library(data.table)

Rohdaten <- fread("DATA/Beispiel.csv", sep=";", dec=",")
nichtNull <- Rohdaten[rowSums(Rohdaten[  , !"Merkmal"] != 0) != 0, ]
Ergebnis  <- round(nichtNull[, lapply(.SD, mean), by = Merkmal],2)

setorder(Ergebnis, Merkmal)
Meine ursprüngliche Zeile zum Einlesen ...

Code: Alles auswählen

Rohdaten <- read.csv("DATA/Beispiel.csv", sep=";", dec=",")
... führte dazu, das diese Zeile im Code:

Code: Alles auswählen

nichtNull <- Rohdaten[rowSums(Rohdaten[  , !"Merkmal"] != 0) != 0, ]
... bei [ , !"Merkmal"] ... eine Fehlermeldung ("Fehler in !"Merkmal" : ungültiger Argumenttyp") brachte. Erst als ich "fread" wieder verwendete, klappte es einwandfrei. *grübel

Aber nochmal ... muchas doll viel gracias :)
Isegrimm
Beiträge: 14
Registriert: Mo Mär 16, 2020 9:52 am

Re: Neuer Datensatz aus "For-Schleife"

Beitrag von Isegrimm »

@Bernhard:

Sorry, das war vielleicht missverständlich ...

Gemeint war:

"Nimm alle Felder unter "Kriterium 1", die in Zeilen des gleichen Merkmals (z.B. "320") stehen und bilde daraus den Mittelwert. (Das gleiche für "Kriterium 2", "Kriterium 3" und "Kriterium 4") und wiederhole das für jedes Merkmal. Erzeuge daraus einen eigenen Datensatz ("Ergebnis") )

Wie schon geschrieben, der Code von "Athomas" lieferte das gewünschte Ergebnis :)

Auch Dir Danke für die Mithilfe.
Isegrimm
Beiträge: 14
Registriert: Mo Mär 16, 2020 9:52 am

Re: Neuer Datensatz aus "For-Schleife"

Beitrag von Isegrimm »

Leider etwas zu früh gefreut :(

Zur Erklärung:

"tempeva" ist das temporäre Objekt zum Einlesen der *.csv
"SHORT" ist die auf drei Zeichen gekürzte Kennung.

Daraufhin habe ich einen neuen Dataframe ("semeva") angelegt und die benötigten Spalten aus "tempeva" überführt. Soweit lief alles cremig.

("semeva" ist mit der Beispieltabelle von oben identisch, sie hat nur mehr Zeilen)

Dann habe ich die Bezeichnungen angepasst ... und lies das Script laufen.

Als die Zeile ...

Code: Alles auswählen

nichtNull <- semeva[rowSums(semeva[  , !"SHORT"] != 0) != 0, ]
... erreicht war, erhielt ich folgende Fehlermeldung:
Fehler in !"SHORT" : ungültiger Argumenttyp
Und das verstehe ich nicht. Die Tabellen ist identisch (zu der obigen) ... dort lief der Code sauber durch.

Hab ich bei der Erzeugung von "semeva" irgendeinen Fehler gemacht?


Hier der bisherige Code:

Code: Alles auswählen

library(data.table)

tempeva <- fread("DATA/Evaluation.csv", sep=";", dec=",")
tempeva$SHORT <- substr(tempeva$SEM_TERM_NR, 1, 3)

### Neuen bereinigten Datatable erzeugen

rows <- nrow(tempeva)

semeva <- data.frame(matrix(ncol = 0, nrow = rows))

semeva$SHORT <- tempeva$SHORT
semeva$INHALT <- tempeva$`Evaluierung - Mittelwert Frage 1 - INHALT`
semeva$VERMITTLUNG <- tempeva$`Evaluierung - Mittelwert Frage 2 - VERMITTLUNG`
semeva$NUTZEN <- tempeva$`Evaluierung - Mittelwert Frage 3 _ NUTZEN`
semeva$UNTERKUNFT <- tempeva$`Evaluierung - Mittelwert Frage 4 - UNTERKUNFT`
semeva$GESAMT <- tempeva$`Evaluierung - Mittelwert Fragen 1 bis 3 - SEMINAR`

nichtNull <- semeva[rowSums(semeva[  , !"SHORT"] != 0) != 0, ]
Ergebnis  <- round(nichtNull[, lapply(.SD, mean), by = SHORT],2)

setorder(Ergebnis, SHORT)
bigben
Beiträge: 2894
Registriert: Mi Okt 12, 2016 9:09 am

Re: Neuer Datensatz aus "For-Schleife"

Beitrag von bigben »

Du musst unterscheiden zwischen Dataframes und Datatables. Darauf lassen sich beide Fehler zurückführen.

Code: Alles auswählen

semeva <- data.frame(matrix...
erzeugt eine Dataframe, kein Datatable. Das gleiche gilt für read.csv.

Wenn man die Vorteile von Datatables nutzen will muss man sich leider mit den Übereinstimmungen und Unterschieden beschäftigen.

HTH,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Benutzeravatar
student
Beiträge: 747
Registriert: Fr Okt 07, 2016 9:52 am

Re: Neuer Datensatz aus "For-Schleife"

Beitrag von student »

Hallo Isegrimm,

lasse einfach die rowNames-Funktion einfach weg....
Viele Grüße,
Student
-----------------------------------------------------------------------------------------------------------------------
faes.de, Datenanalyse mit R & das Ad-Oculos-Projekt
Das Ad-Oculos-Projekt auf YouTube

Habe Mut, dich deines eigenen Verstandes zu bedienen! (Kant)
Antworten