Konvertieren Sie mehrere Listenobjekte in eine Matrix in eine tatsächliche Liste
Frage
Ich habe die täglichen Temperaturdaten über einen Zeitraum von 45 Jahren extrahiert. Ich habe alle Möglichkeiten verwendet, die ich mir vorstellen konnte, um diese Daten in eine Variable anzuhängen, die jedes Jahr wächst. Neben dem Wert habe ich auch die Zeit eingeschlossen (AS.Date). Meine endgültige Variable besteht leider aus 45 Zeilen und 2 Spalten mit jeder Zelle, die den Wert (linke Spalte) und das Datum (rechte Spalte) enthält. Ich kann jedoch keinen Weg finden, die Zellen zu "erweitern", um zwei Spalten zu gewinnen, die einen Wert pro Zelle enthalten.
Zuerst habe ich versucht, eine bessere Variable aus der Schleife mit Merge zu bekommen (bis = 'Datum'), aber es funktioniert nicht, da ich nur die Daten eines einzelnen Jahres habe. Ich suche nach einem Befehl, der entweder die Zellen erweitert oder noch besser die beiden Spalten (Wert und Datum) am unteren Rand meiner Variablen innerhalb der Schleife als einzelne Einträge für jede Zelle anhängen.
Die Eingabedaten sind eine Textdatei mit den Jahresblocks (führende Zeile mit dem Jahr geschrieben, z. B. 1960 und einer 31 x 13-Matrix). -9999 sind meine Na-Flags.
1960 - - - - - - - - - - - -
1 -22.2 -13.5 -6.2 -5.4 . . . x(1,13)
2 -22.4 -15.9 -5.7 7.6 . . . x(2,13)
.
.
.
31
30 -9.9 -9999 -8 4.8 . . . x(30,13)
31 -17 -9999 -6.2 . . . x(31,13)
1961 - - - - - - - - - - - -
1 -17.8 -22.6 -11.7 -0.5 4 11.9 10.4 14.8 12 -0.1 -9.2 -16.3
Der Code vereinfacht:
dat1 <- data.frame(read.table(filename))
dat1$NUM <- 1:length(dat1$V1) #I needed an index
TYs <- 1960 # Year start
TYe <- 2005 # Year end
TYi–TYs
TMP3 <- NULL #The variable that should store the data. Append new data every loop
while (TYi <= TYe){
index <- dat1$NUM[dat1$V1==TYi]
# get the start and stop of matrix indices
begin <- index+1
end <- begin+30
oddyear <-format(as.Date(paste('3112',TYi),'%d%m%Y'),'%j')== '366' #checks if TYi is oddyear
if (oddyear==TRUE){
date <- seq(as.Date(paste('0101',TYi), '%d%m%Y'),as.Date(paste('3112',TYi), '%d%m%Y'),'day')
TMP2 <- NULL
TMP2$data[1:31] <- TMP[1:31]
TMP2$data[32:60] <- TMP[32:60]
#...
TMP2$data[336:366] <- TMP[342:372]
TMP2$date <- date
TMP3 <- rbind(TMP3, TMP2)
TYi <- TYi+1
TMP2 <- NULL
TMP <- NULL
} else { # similar with one day less for non-oddyears
}
Das bekomme ich am Ende für TMP3:
data date
TMP2 Character,366 Numeric,366
TMP2 Character,365 Numeric,365
TMP2 Character,365 Numeric,365
Was ich will ist das:
data date
-22.2 1960-01-01
-22.4 1960-02-01
...
Prost, Eric
Lösung
Eric, ich stimme Justin zu, dass es sehr schwierig ist, Ihnen die richtige Antwort ohne reproduzierbare Probe zu geben. Ich würde jedoch empfehlen, das XTS -Paket zu verwenden, wenn Timeseries beteiligt sind.
require('xts')
result<-xts(12.22,order.by=as.POSIXct(paste('1990','-','01','-','01',sep='')))
Für die Verkettung der Verwendung anschließend:
result<-rbind(result,xts(11.22,order.by=as.POSIXct(paste('1991','-','01','-','01',sep=''))))
Du solltest bekommen:
1990-01-01 12.22
1991-01-01 11.22
Andere Tipps
Es klappt. Und ich fand sogar den Befehl, den ich verwenden wollte (unlist ()).
result <- xts(as.numeric(unlist(XX[,1])), order.by=as.Date(unlist(XX[,2])))
Die Einträge in meinem Ergebnis (xx) waren Listen in der Matrix. Durch die Verwendung von Unlist () in Kombination mit XTS () funktioniert es wunderbar.
Vielen Dank, Jungs.
Eric