将矩阵中的多个列表对象转换为实际列表

时间:2012-02-16 23:03:21

标签: r xts

我提取了45年的每日温度数据。我使用了我能想到的所有可能性来附加,cbind,将这些数据转换为每年增长的变量循环。 除了价值,我还包括时间(as.Date)。不幸的是,我的最终变量由45行和2列组成,每个单元格包含值(左列)和日期(右列)。但是,我找不到一种方法来扩展'单元格获得两列,每个单元格包含一个值。

起初我试图从循环中获得一个更好的变量with merge(,by =' date')但它不起作用,因为我只有一年的日期。 我正在寻找一个扩展单元格的命令,或者更好的是,它会在循环内部的变量底部附加两列(值和日期)作为每个单元格的单个条目。

输入数据是一个文本文件,其中年份块(带有年份的前导行,例如1960,并且31 x 13矩阵)彼此下面写入。 -9999是我的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

简化代码:

 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
...

干杯, 埃里克

2 个答案:

答案 0 :(得分:0)

埃里克 我同意Justin的观点,如果没有可重复的样本,很难给出正确答案。但是,我建议在涉及时间序列时使用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

答案 1 :(得分:0)

有效。我甚至找到了我打算使用的命令(unlist())。

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

我的结果(XX)中的条目是矩阵内的列表。通过将unlist()与xts()结合使用,它可以很好地工作。

非常感谢你们。

埃里克