convertire diversi oggetti elenco in una matrice a un elenco effettivo

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

  •  26-10-2019
  •  | 
  •  

Domanda

I dati estratti temperatura giornaliera in un arco di tempo di 45 anni. Ho usato tutte le possibilità che potrei pensare di aggiungere, cbind, rbind tali dati in una variabile che cresce ogni ciclo anno. Oltre al valore ho incluso anche il tempo (as.Date). Mia variabile finale purtroppo consiste di 45 righe e 2 colonne con ciascuna cella che contiene il valore (colonna di sinistra) e la data (colonna di destra). Tuttavia, non riesco a trovare un modo per 'ampliare' le cellule per ottenere due colonne contenenti un valore per cella.

In un primo momento ho cercato di ottenere una variabile meglio dal ciclo con merge (, da = 'data') ma non sta funzionando in quanto ho solo le date di un solo anno. Sto cercando un comando che o si espande le cellule, o, meglio ancora, che sarebbe davvero aggiungere i due colonne (valore e data) nella parte inferiore della mia variabile all'interno del ciclo come voci singole per ogni cella.

I dati di input è un file di testo con gli anni di blocchi (leader fila all'anno scritta esempio 1960, ed una matrice 31 x 13) sono scritti sotto l'altro. -9999 sono i miei 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

Il codice semplificato:

 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
}

Questo è ciò che ottengo alla fine per TMP3:

    data          date       
TMP2 Character,366 Numeric,366
TMP2 Character,365 Numeric,365
TMP2 Character,365 Numeric,365

Quello che voglio è questa:

data          date       
-22.2    1960-01-01
-22.4    1960-02-01
...

Saluti, Eric

È stato utile?

Soluzione

Eric, Sono d'accordo con Justin, che è molto difficile dare la risposta giusta senza campione riproducibile. Tuttavia, vorrei consigliare di usare il pacchetto XTS quando timeseries sono coinvolti.

require('xts')
result<-xts(12.22,order.by=as.POSIXct(paste('1990','-','01','-','01',sep='')))

Per l'uso di concatenazione seguente:

result<-rbind(result,xts(11.22,order.by=as.POSIXct(paste('1991','-','01','-','01',sep=''))))

Si dovrebbe ottenere:

1990-01-01 12.22
1991-01-01 11.22

Altri suggerimenti

Funziona. E ho anche trovato il comando che ho intenzione di usare (non elencati ()).

result <- xts(as.numeric(unlist(XX[,1])), order.by=as.Date(unlist(XX[,2])))

Le voci nella mia risultato (XX) sono stati gli elenchi all'interno della matrice. Utilizzando non elencati () in combinazione con XTS () che funziona a meraviglia.

Grazie mille ragazzi.

Eric

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top