convertir plusieurs objets de la liste dans une matrice à une liste réelle
Question
I extrait les données de température par jour pendant un laps de temps de 45 ans. Je toutes les possibilités que je pouvais penser à ajouter, cbind, rbind ces données dans une variable qui augmente chaque boucle de l'année. En plus de la valeur que j'inclus aussi le temps (as.Date). Ma dernière variable se compose malheureusement de 45 lignes et 2 colonnes avec chaque cellule contenant la valeur (colonne de gauche) et la date (colonne de droite). Cependant, je ne peux pas trouver un moyen de « développer » les cellules pour obtenir deux colonnes contenant une valeur par cellule.
Dans un premier temps j'ai essayé d'obtenir une meilleure variable de la boucle avec fusion (par « date » =), mais il ne fonctionne pas puisque je n'ai que les dates d'une seule année. Je suis à la recherche d'une commande qui soit étend les cellules, ou, encore mieux, ce serait vraiment append les deux colonnes (valeur et date) au bas de ma variable dans la boucle comme des entrées uniques pour chaque cellule.
Les données d'entrée est un fichier texte à l'année-blocs (conduisant rangée à l'année écrit par exemple 1960, et une matrice 31 x 13) sont écrits au-dessous de l'autre. -9999 sont mes NA-drapeaux.
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
Le code simplifié:
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
}
Voici ce que je reçois à la fin pour TMP3:
data date
TMP2 Character,366 Numeric,366
TMP2 Character,365 Numeric,365
TMP2 Character,365 Numeric,365
Ce que je veux est ceci:
data date
-22.2 1960-01-01
-22.4 1960-02-01
...
Cordialement, Eric
La solution
Eric, Je suis d'accord avec Justin, qu'il est très difficile de vous donner bonne réponse sans échantillon reproductible. Cependant, je vous conseille d'utiliser package XTS quand timeseries sont impliqués.
require('xts')
result<-xts(12.22,order.by=as.POSIXct(paste('1990','-','01','-','01',sep='')))
Pour une utilisation de concaténation suivant:
result<-rbind(result,xts(11.22,order.by=as.POSIXct(paste('1991','-','01','-','01',sep=''))))
Vous devriez obtenir:
1990-01-01 12.22
1991-01-01 11.22
Autres conseils
Il fonctionne. Et j'ai même trouvé la commande que je comptais utiliser (unlist ()).
result <- xts(as.numeric(unlist(XX[,1])), order.by=as.Date(unlist(XX[,2])))
Les entrées de mon résultat (XX) sont des listes à l'intérieur de la matrice. En utilisant unlist () en combinaison avec XTS (), il fonctionne à merveille.
Merci beaucoup les gars.
Eric