Konvertieren Sie mehrere Listenobjekte in eine Matrix in eine tatsächliche Liste

StackOverflow https://stackoverflow.com/questions/9320472

  •  26-10-2019
  •  | 
  •  

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

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top