在R中使用do.call合并zoo对象

时间:2016-05-20 08:05:38

标签: r merge zoo do.call

A有几个像这样的csv文件:

,timestamp,AirTemperature_House
    1,2013-09-01 00:00:00,8.22
    2,2013-09-01 01:00:00,6.53
    3,2013-09-01 02:00:00,6.67
    4,2013-09-01 03:00:00,5.58
    5,2013-09-01 04:00:00,4.16
    6,2013-09-01 05:00:00,4.76
    7,2013-09-01 06:00:00,5.06
    8,2013-09-01 07:00:00,5.16
    9,2013-09-01 08:00:00,6.83
    10,2013-09-01 09:00:00,8.59
    11,2013-09-01 10:00:00,10.99
    12,2013-09-01 11:00:00,11.08

我使用以下代码将它们分组到zoo对象列表中:

raw_data<-list.files(path = "./AWS_Data_STU/Air_temp/",pattern="Air",full.names = T)

data_stu<-lapply(raw_data,function(x){
   ss<-read.csv(x)

  ss<-zoo(ss,order.by = ss$timestamp)


})

我制作了一个动物园对象列表,它们看起来都像这样:

str(data_stu[[1]])

    ‘zoo’ series from 2013-09-01 00:00:00 to 2014-04-30 23:00:00
      Data: num [1:5808] 8.22 6.53 6.67 5.58 4.16 4.76 5.06 5.16 6.83 8.59 ...
      Index:  Factor w/ 5808 levels "2013-09-01 00:00:00",..: 1 2 3 4 5 6 7 8 9 10

...

我想将我的所有列表合并到数据框中:

X1  x2  x3  X4 x5 x6  x7
1 12.95    NA NA NA    
2 14.81 14.37 NA NA 12.78 NA 
3 15.02 15.11 NA NA 12.61 NA 
4 13.91 14.25 NA NA 11.89 NA 
5 12.34 13.96 NA NA 10.86 NA 
6 14.40 14.47 NA NA 10.40 NA 

我使用了do call函数

do.call(merge.zoo,data_stu )

    structure(c(7.66, 7.29, 7.34, 7.15, 6.76, 6.41, 6.25, 6.36, 6.78, 
    1                                                                    NA
    2                                                                    NA
    3                                                                    NA
    4                                                                    NA
    5                                                                    NA
    6                                                                    NA
    7                                                                    NA
    8                    

但它只给了我NA对象。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

问题是所有动物园对象的索引都是因子。您需要将它们转换为POSIXct。此外,您不应该直接调用方法。即,您应该调用merge而不是merge.zoo,让R处理方法调度。

您还可以使用read.zoo来帮助转换。

data_stu <- do.call(merge, lapply(raw_data, read.zoo, sep=",", header=TRUE,
    FUN=as.POSIXct, colClasses=c("NULL", "character", "numeric")))