Pregunta

Extraje los datos de temperatura diaria en un lapso de tiempo de 45 años. Utilicé todas las posibilidades que se me ocurriera para agregar, CBind, llevar esos datos a una variable que crece cada bucle de año. Además del valor, también incluí el tiempo (como. Date). Desafortunadamente, mi variable final consta de 45 filas y 2 columnas con cada celda que contiene el valor (columna izquierda) y la fecha (columna derecha). Sin embargo, no puedo encontrar una manera de 'expandir' las celdas para obtener dos columnas que contienen un valor por celda.

Al principio intenté obtener una mejor variable desde el bucle con Merge (, by = 'date') pero no funciona ya que solo tengo las fechas de un solo año. Estoy buscando un comando que expande las celdas o, aún mejor, que realmente agregue las dos columnas (valor y fecha) en la parte inferior de mi variable dentro del bucle como entradas individuales para cada celda.

Los datos de entrada son un archivo de texto con los bloques de año (la fila líder con el año escrito, por ejemplo, 1960, y una matriz de 31 x 13) se escriben debajo de la otra. -9999 son mis flags na.

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

El código simplificado:

 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
}

Esto es lo que obtengo al final para TMP3:

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

Lo que quiero es esto:

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

Saludos, Eric

¿Fue útil?

Solución

Eric, estoy de acuerdo con Justin, que es muy difícil darle una respuesta correcta sin una muestra reproducible. Sin embargo, aconsejaría usar el paquete XTS cuando se involucren Timeseries.

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

Para el uso de concatenación a continuación:

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

Deberías obtener:

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

Otros consejos

Funciona. E incluso encontré el comando que tenía la intención de usar (UnlIs ()).

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

Las entradas en mi resultado (xx) fueron listas dentro de la matriz. Mediante el uso de UNLIST () en combinación con Xts () funciona maravillosamente.

Muchas gracias chicos.

Eric

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top