convertir plusieurs objets de la liste dans une matrice à une liste réelle

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

  •  26-10-2019
  •  | 
  •  

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

Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top