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

Re: Neuer Datensatz aus "For-Schleife"

Beitrag von Isegrimm »

Update:

Nachdem "bigben" mir den Unterschied zwischen "data.frame" und "data.table" näher gebracht hat, habe ich jetzt einen Code gebastelt, der in sich lauffähig ist.

(Die inflationäre Kommentierung soll nur meine Gedanken und Lösungsansätze nachvollziehen lassen.)

Ich gehe allerdings davon aus, das der Code noch "unsauber" ist, also Schritte durchlaufen werden, die man vielleicht straffen und zusammenführen kann, wie z.B. den Umstand, dass ich erst einen "data.frame" erzeuge, diesen dann in einen "data.table" konvertiere und danach die Spalte "SHORT" (die Aufgrund ihres Typs ("character") Probleme erzeugte) in den Typ "numeric" konvertiere) ... wobei mir nicht klar ist, warum R ihr den Typ "character" überhaupt zuweist.

Code: Alles auswählen

library(data.table)

library(readr)

### EINLESEN DER *.CSV-DATEI
tempeva <- fread("DATA/Evaluation.csv", sep=";", dec=",")

### ERZEUGEN DER SPALTE "SHORT" als Merkmal mit den linken 3 Zeichen der ID
tempeva$SHORT <- substr(tempeva$SEM_TERM_NR, 1, 3)

### NEUEN, BEREINIGTEN DATAFRAME ERZEUGEN

### ERMITTLUNG DER TABELLENWEITE VON "TEMPEVA"
rows <- nrow(tempeva)

### ERZEUGEN EINES LEEREN DATA.FRAME
semtemp <- data.frame(matrix(ncol = 0, nrow = rows))

### KONVERTIERUNG DES LEEREN DATA.FRAME IN EINEN DATA.TABLE
semeva <- as.data.table(semtemp)

### IMPORT DER NOTWENDIGEN SPALTEN
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`

### KONVERTIERUNG VON "SHORT" IN DEN TYP "NUMERIC"
semeva$SHORT <- as.numeric(semeva$SHORT)

# class(semeva$SHORT)
# 
# View(semeva)

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

### SORTIERUNG DES ERGEBNISSES
setorder(Ergebnis, SHORT)

### ABSPEICHERN DES ERGEBNISSES (FUER EVTL. WEITERE ZWECKE)
write_excel_csv2(Ergebnis, file=paste0("DATA/Ergebnis_", format(Sys.time(), "%Y-%m-%d_%H-%M")))
bigben
Beiträge: 2894
Registriert: Mi Okt 12, 2016 9:09 am

Re: Neuer Datensatz aus "For-Schleife"

Beitrag von bigben »

Hi!
Isegrimm hat geschrieben: So Nov 03, 2024 8:05 amDie inflationäre Kommentierung soll nur meine Gedanken und Lösungsansätze nachvollziehen lassen.)
Das ist ganz genau die Aufgabe von Kommentaren und ab wann die inflationär ist hängt ganz allein von Deinen Bedürfnissen ab.
dass ich erst einen "data.frame" erzeuge, diesen dann in einen "data.table" konvertiere


Du kannst hier ganz einfache data.table() als drop-in-Ersatz für data.frame() benutzen. Um einen Dataframe sehr effizient in ein Datatable zu verwandeln gibt es sonst noch die Funktion setDT() aber hier erzeugst Du am einfachsten direkt mit data.table().
wobei mir nicht klar ist, warum R ihr den Typ "character" überhaupt zuweist.
Immer dann, wenn die Einlesefunktion eine einzige Zeile findet, die nicht wie eine Zahl aussieht, wird die ganze Spalte zu character. Dazu reicht es, dass in einer einzigen Zeile statt eines Kommas ein Punkt steht oder eine Null durch ein "O" wie in "Otto" ersetzt ist oder ein Leerzeichen zwischen die Ziffern gerutscht ist oder, oder, oder. Vielleicht interessiert Dich mein alter Beitrag hier: viewtopic.php?t=3516

Code: Alles auswählen

### ERZEUGEN EINES LEEREN DATA.FRAME
semtemp <- data.frame(matrix(ncol = 0, nrow = rows))

### KONVERTIERUNG DES LEEREN DATA.FRAME IN EINEN DATA.TABLE
semeva <- as.data.table(semtemp)
Der Umweg über die leere Matrix ist unnötig. Ein Datatable mit 0 Reihen und 0 Spalten kannst du einfach so erzeugen:

Code: Alles auswählen

> semtemp <- data.table()
> semtemp
Null data.table (0 rows and 0 cols)

Code: Alles auswählen

write_excel_csv2
Die Funktion deutet darauf hin, dass Du das Paket readr verwendest. In dem Fall muss ich Dir leider mitteilen, dass es außer Dataframes und Datatables auch noch Tibbles gibt und das die drei alle sehr ähnlich aussehen, sich aber ausreichend unterscheiden um zu Fehlermeldungen zu führen. Also: Das Schreiben Deines Datatables mit diesem Paket/dieser Funktion sollte kein Problem sein, aber wenn Du das Paket readr zum Einlesen von Daten verwendest kommt da eben noch ein dritter Typ heraus, das sog. tibble. Ist jetzt erstmal kein Problem, ich wollte nur ein Problembewusstsein für später mal schaffen. Kann man alles mit data.table() oder as.data.table() wieder flicken.

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