datensatz teilen und einzeln speichern

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

Moderatoren: EDi, jogo

Antworten
HerrTischbein

datensatz teilen und einzeln speichern

Beitrag von HerrTischbein »

Liebes Forum,
ich habe recht große Datensätze und möchte die zwecks besserer Handhabung zerteilen (je Tag - hab von Euch eine schöne Funktion dafür) und dann einzeln abspeichern.
Das ist mein code und die Art des speicherns, d.h. jeden Tag einzeln - gibt es eine Möglichkeit alle Daten je Tag in einer einzelnen Datei zu speichern? WIe kann ich die Datei dann benennen (lassen), z.B. mit dem Tag (hier D186)?

Code: Alles auswählen

pres.data <- fread("Test.txt", header=TRUE, 
                  sep="\t", na.strings="NA", dec=",", strip.white=TRUE)
pres.data$Datum <- as.POSIXct(pres.data$Datum, format = '%d.%m.%Y')
pres.data$dt <- as.POSIXct(paste0(pres.data$Datum,' ', pres.data$Zeit), format = '%Y-%m-%d %H:%M')
pres.data$doy <- as.numeric(strftime(pres.data$dt, format = "%j"))
pres.data$hod <- as.numeric(strftime(pres.data$dt, format = "%H"))
[attachment=0]Test.txt[/attachment]pres.data

D186 <- pres.data[pres.data$doy == 186,]
write.table(D186, file="D186.txt",
            na = "NA",sep = "\t",dec = ".",col.names = TRUE, quote = FALSE)
Habt vielen Dank.
Herzliche Grüße
jogo
Beiträge: 2086
Registriert: Fr Okt 07, 2016 8:25 am

Re: datensatz teilen und einzeln speichern

Beitrag von jogo »

Code: Alles auswählen

D186 <- pres.data[pres.data$doy == 186,]  
write.table(D186, file="D186.txt",  
            na = "NA",sep = "\t",dec = ".",col.names = TRUE, quote = FALSE)
Ich würde aus diesem Teil erstmal eine Funktion stricken:

Code: Alles auswählen

writeD <- function(D) {
   Ddata <- pres.data[pres.data$doy == D,]  
   write.table(Ddata, file=paste0("D",D,".txt"), na = "NA",sep = "\t",dec = ".",col.names = TRUE, quote = FALSE)
}
Dann kannst Du diese Funktion auch in einem lapply()-Aufruf verwenden.

Gruß, Jörg
HerrTischbein

Re: datensatz teilen und einzeln speichern

Beitrag von HerrTischbein »

Hallo Jörg,
vielen Dank für die schnelle Antwort.

Code: Alles auswählen

pres.data <- fread("Test.txt", header=TRUE, 
                  sep="\t", na.strings="NA", dec=",", strip.white=TRUE)
pres.data$Datum <- as.POSIXct(pres.data$Datum, format = '%d.%m.%Y')
pres.data$dt <- as.POSIXct(paste0(pres.data$Datum,' ', pres.data$Zeit), format = '%Y-%m-%d %H:%M')
pres.data$doy <- as.numeric(strftime(pres.data$dt, format = "%j"))
pres.data$hod <- as.numeric(strftime(pres.data$dt, format = "%H"))
str(pres.data) 

writeD <- function(D) {
  Ddata <- pres.data[pres.data$doy == D,] 
  write.table(Ddata, file=paste0("D",D,".txt"), na = "NA",sep = "\t",dec = ".",col.names = TRUE, quote = FALSE)
}

lapply(pres.data, writeD)
als Fehler bekomme ich dann diese Meldung:
> lapply(pres.data, writeD)
Error in file(file, ifelse(append, "a", "w")) :
invalid 'description' argument

In addition: Warning message:
In if (file == "") file <- stdout() else if (is.character(file)) { :
the condition has length > 1 and only the first element will be used
>
Hängt das mit dem format data.table und Liste zusammen?
jogo
Beiträge: 2086
Registriert: Fr Okt 07, 2016 8:25 am

Re: datensatz teilen und einzeln speichern

Beitrag von jogo »

Code: Alles auswählen

lapply(pres.data, writeD)
Du wendest die Funktion auf eine falsche Weise an.
richtig:

Code: Alles auswählen

lapply(184:187, FUN=writeD)
Gruß, Jörg
p.s.:
Das einzige, was mir noch einfällt, was Du vielleicht haben möchtest, ist:

Code: Alles auswählen

file=sprintf("D%03i.txt", D)
im Aufruf der Funktion write.table() (für den Fall, dass D<100 ist)
HerrTischbein

Re: datensatz teilen und einzeln speichern

Beitrag von HerrTischbein »

Hallo Jörg, vielen Dank - das scheint zu klappen und
ja, die Ergänzung

Code: Alles auswählen

file=sprintf("D%03i.txt", D)

war genau das was ich gesucht habe.
Herzliche Grüße
Antworten