Преобразовать несколько объектов списка в матрицу в фактический список

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

  •  26-10-2019
  •  | 
  •  

Вопрос

Я извлекал ежедневные данные о температуре в течение 45 лет. Я использовал все возможности, которые я мог бы подумать, чтобы добавить, CBIND, запустить эти данные в переменную, которая растет каждый год. Помимо значения, я также включил время (as.date). К сожалению, моя конечная переменная состоит из 45 строк и 2 столбца с каждой ячейкой, содержащей значение (левый столбец) и даты (правый столбец). Тем не менее, я не могу найти способ «расширить» ячейки, чтобы получить два столбца, содержащие одно значение на ячейку.

Сначала я попытался получить лучшую переменную из петли с Merge (, by = 'date'), но она не работает, так как у меня есть только даты одного года. Я ищу команду, которая либо расширяет ячейки, либо, что еще лучше, это действительно добавило бы два столбца (значение и дата) внизу моей переменной внутри петли в виде отдельных записей для каждой ячейки.

Входные данные представляют собой текстовый файл с годовыми блоками (ведущая строка с написанным годом, например, 1960, а матрица 31 x 13) записаны друг друга. -9999-мои 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

Код упрощен:

 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
}

Это то, что я получаю в конце для TMP3:

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

Я хочу следующее:

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

Ура, Эрик

Это было полезно?

Решение

Эрик, я согласен с Джастином, что очень трудно дать вам правильный ответ без воспроизводимой выборки. Тем не менее, я бы посоветовал использовать пакет XTS, когда участвуют временные интернет.

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

Для следующего использования конкатенации:

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

Вы должны получить:

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

Другие советы

Оно работает. И я даже нашел команду, которую намеревался использовать (Unlist ()).

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

Записи в моем результате (xx) были списками внутри матрицы. Используя Unlist () в сочетании с XTS (), он работает красиво.

Большое спасибо, ребята.

Эрик

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top