Mehrere text files transponieren und in eine Tabelle zusammenfügen

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

Moderatoren: EDi, jogo

Julia_E
Beiträge: 6
Registriert: Fr Mär 15, 2019 11:48 am

Mehrere text files transponieren und in eine Tabelle zusammenfügen

Beitrag von Julia_E »

Hallo,
ich bin relativ neu in R und hoffe mir kann wer helfen:
ich habe einen folder mit 787 text files, die so aussehen:
19.5642 [Mittelwert]
0.4900 [CV]
1.1852 [CS]

Nun würde ich gern alle 787 in eine Tabelle zusammenfügen mit folgendem header:
filename Mittelwert cv cs

Kann mir irgendjemand weiterhelfen?

Vielen Dank schon mal!

LG Julia
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Mehrere text files transponieren und in eine Tabelle zusammenfügen

Beitrag von jogo »

Hallo Julia,

willkommen im Forum!
Kannst Du uns vier von diesen Dateien bereitstellen, damit wir etwas rumexperimentieren können?
Eigentlich könnte man die Dateien auch hintereinander einlesen:
so ähnlich wie in https://stackoverflow.com/questions/114 ... es-at-once
und anschließend vom langen Format ins breite Format transformieren:
https://stackoverflow.com/questions/589 ... ide-format

Gruß, Jörg
Julia_E
Beiträge: 6
Registriert: Fr Mär 15, 2019 11:48 am

Re: Mehrere text files transponieren und in eine Tabelle zusammenfügen

Beitrag von Julia_E »

Hallo Jörg,
vielen Dank für deine Antwort. Ich werd mir das gleich mal ansehen.

Anbei ist ein zip file mit einem Ordner und ein paar Beispiel Files darin (bei mir sind das Ganze dann fast 800 files).
Super wäre eben wenn jedes file dann eine Zeile in der neuen Tabelle ausmacht (inklusive dem File Namen als Zuordnung):
file Mittelwert cv cs
q230755d.mom 7.585455 0.5663059 1.544483
q1008803.mom 1859.165 0.3 1.0
q1100013.mom 19.5642 0.49 1.1852
q1218303.mom 57.6503 0.49 1.3


mom.zip
Besispiel
(1.16 KiB) 26-mal heruntergeladen
LG
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Mehrere text files transponieren und in eine Tabelle zusammenfügen

Beitrag von jogo »

Hallo Julia,

hier eine Variante für das Einlesen bis zum Erzeugen des Dataframes im langen Format:

Code: Alles auswählen

setwd("~/Desktop/R.Zeug/Julia_E/mom")
dir() # schauen, ob die Dateien wirklich hier sind
Dateien <- dir()

Lesen <- function(Datei) {
  Dat <- read.table(Datei)
  Dat$dateiname <- Datei
  Dat
}

L <- lapply(Dateien, Lesen)
do.call(rbind, L)
Das liefert bei mir:

Code: Alles auswählen

> do.call(rbind, L)
             V1           V2    dateiname
1  1859.1650000 [Mittelwert] q1008803.mom
2     0.3000000         [CV] q1008803.mom
3     1.0000000         [CS] q1008803.mom
4    19.5642000 [Mittelwert] q1100013.mom
5     0.4900000         [CV] q1100013.mom
6     1.1852000         [CS] q1100013.mom
7    57.6505300 [Mittelwert] q1218303.mom
8     0.4900000         [CV] q1218303.mom
9     1.3000000         [CS] q1218303.mom
10   26.7083000 [Mittelwert] q1233003.mom
11    0.6000000         [CV] q1233003.mom
12    1.4000000         [CS] q1233003.mom
13    7.5854550 [Mittelwert] q230755d.mom
14    0.5663059         [CV] q230755d.mom
15    1.5444830         [CS] q230755d.mom
So, auf zum zweiten Teil;
ich habe es mir diesmal einfach gemacht:

Code: Alles auswählen

alleDat <- do.call(rbind, L)
M <- matrix(alleDat$V1, ncol=3, byrow=TRUE)
rownames(M) <- Dateien
M
ergibt:

Code: Alles auswählen

> M
                    [,1]      [,2]     [,3]
q1008803.mom 1859.165000 0.3000000 1.000000
q1100013.mom   19.564200 0.4900000 1.185200
q1218303.mom   57.650530 0.4900000 1.300000
q1233003.mom   26.708300 0.6000000 1.400000
q230755d.mom    7.585455 0.5663059 1.544483
Jetzt noch etwas Kosmetik:

Code: Alles auswählen

colnames(M) <- c("Mittelwert", "CV", "CS")
und wenn Du möchtest, dann:

Code: Alles auswählen

Mdat <- as.data.frame(M)
Gruß, Jörg
Julia_E
Beiträge: 6
Registriert: Fr Mär 15, 2019 11:48 am

Re: Mehrere text files transponieren und in eine Tabelle zusammenfügen

Beitrag von Julia_E »

Hallo Jörg,
vielen Dank für deine Hilfe.
Das ist alles etwas Neuland für mich. :(

Ich hab deinen code probiert und bei mir kommt das raus (siehe Anhang).
Dateianhänge
R_Error.PNG
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Mehrere text files transponieren und in eine Tabelle zusammenfügen

Beitrag von jogo »

Hallo Julia,

klar:
die Datei alleMomsSammeln.vbs gehört sicher nicht zu den Dateien, die Du einlesen möchtest.
Bitte ändere im Code wie folgt:

Code: Alles auswählen

Dateien <- dir(pattern="\\.mom$")
So landen in dem Vektor Dateien nur die Dateinamen, die mit .mom enden.

Gruß, Jörg
Julia_E
Beiträge: 6
Registriert: Fr Mär 15, 2019 11:48 am

Re: Mehrere text files transponieren und in eine Tabelle zusammenfügen

Beitrag von Julia_E »

Hallo Jörg,
sorry, aber ich weiß nicht weiter. Ich steh' beim L <- lapply(Dateien, Lesen) an.
Hab pattern=mom ausprobiert und hab auch probiert alle anderen files aus dem Ordner zu löschen.
Trotzdem kommt:
Error in scan(file = file, what = what, sep = sep, quote = quote, dec = dec, :
line 3 did not have 2 elements
Auf was bezieht sich die "line 3" ? Ich komm leider nicht drauf.

LG
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Mehrere text files transponieren und in eine Tabelle zusammenfügen

Beitrag von jogo »

Hallo Julia,

normalerweise sind Deine Dateien so aufgebaut, dass in jeder Zeile zwei Elemente stehen:
1. der Zahlenwert
2. [Mittelwert] oder [CV] oder [CS]

Es gibt offensichtlich mindestens eine Datei, bei der das nicht so ist. Bei dieser Datei wird der Fehler beim Lesen der dritten Zeile erkannt.
Bitte ändere die Funktion:

Code: Alles auswählen

Lesen <- function(Datei) {
  message(paste0("&&& lese jetzt Datei: ", Datei))
  Dat <- read.table(Datei)
  Dat$dateiname <- Datei
  Dat
}
Kannst Du abschätzen, bei wievielen Dateien dieser Fehler besteht?
Du kannst den Fehler auch eingrenzen, indem Du einzeln nacheinander ausführst:

Code: Alles auswählen

lapply(Dateien[1:100], Lesen)
lapply(Dateien[101:200], Lesen)
lapply(Dateien[201:300], Lesen)
...
So, ich habe jetzt selber etwas rumexperimentiert. Bei mir hat read.table(Datei, fill=TRUE) geholfen

Code: Alles auswählen

Lesen <- function(Datei) {
  message(paste0("&&& lese jetzt Datei: ", Datei))
  Dat <- read.table(Datei, fill=TRUE)
  Dat$dateiname <- Datei
  Dat
}
Gruß, Jörg
Julia_E
Beiträge: 6
Registriert: Fr Mär 15, 2019 11:48 am

Re: Mehrere text files transponieren und in eine Tabelle zusammenfügen

Beitrag von Julia_E »

Die fill funktion hat geklappt!
Vielen Dank, Jörg!
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Mehrere text files transponieren und in eine Tabelle zusammenfügen

Beitrag von jogo »

Hallo Julia,

Du solltest das Ergebnis gründlich kontrollieren.
Bei mir hat es die Daten in dem Dataframe, in den ich den Fehler eingebaut habe, kräftig durcheinander gewirbelt.

Gruß, Jörg
Antworten