convertire diversi oggetti elenco in una matrice a un elenco effettivo
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
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