【问题标题】:Question regarding llply or lapply - applying functions to data.frames in a list关于 llply 或 lapply 的问题 - 将函数应用于列表中的 data.frames
【发布时间】:2011-09-25 14:15:51
【问题描述】:

尊敬的 R 用户社区,

我在一个列表中有很多data.frame,如下(为方便起见,21个列表中只有一个data.frame):

> str(datal)
List of 21
 $ BallitoRaw.DAT                :'data.frame': 1083 obs. of  3 variables:
  ..$ Filename: Factor w/ 21 levels "BallitoRaw.DAT",..: 1 1 1 1 1 1 1 1 1 1 ...
  ..$ date    :Class 'Date'  num [1:1083] 7318 7319 7320 7321 7322 ...
  ..$ temp    : num [1:1083] NA 25.8 NA NA NA NA NA NA NA 24.4 ...

如果我单独处理列表中的每个 data.frame,我可以从 temp 和 date 创建一个 zoo 对象,如下所示:

> BallitoRaw.zoo <- zoo(datal$BallitoRaw.DAT$temp, datal$BallitoRaw.DAT$date)

动物园对象如下所示:

> head(BallitoRaw.zoo)
1990-01-14 1990-01-15 1990-01-16 1990-01-17 1990-01-18 1990-01-19 
        NA       25.8         NA         NA         NA         NA 

如何使用 llply 或 apply(或类似方法)同时处理整个列表?

输出需要进入一个新的 data.frames 列表,或一系列独立的 data.frames(每个都按照上面动物园示例中的名称命名)。请注意,日期列虽然是常规时间序列(天),但包含缺失的日期(除了现有日期临时的 NA);缺失的日期将由 zoo 函数填充。因此,带有 zoo 对象的输出 data.frame 将比原来的要长。

帮助,不胜感激。

【问题讨论】:

    标签: list r plyr zoo lapply


    【解决方案1】:
    makeNamedZoo <- function(dfrm){ dfrmname <- deparse(substitute(dfrm))
      zooname <-dfrmname
       assign(zooname,   zoo(dfrm$temp, dfrm$date))
       return(get(zooname)) }
    ListOfZoos <- lapply(dflist, makeNamedZoo)
    names(ListOfZoos) <- paste( sub("DAT$", "", names(dflist) ), "zoo", sep="")
    

    这是一个简单的测试用例:

    df1 <- data.frame(a= letters[1:10], date=as.Date("2011-01-01")+0:9, temp=rnorm(10) )
    df2 <- data.frame(a= letters[1:10], date=as.Date("2011-01-01")+0:9, temp=rnorm(10) )
    dflist <- list(dfone.DAT=df1,dftwo.DAT=df2)
    ListOfZoos <- lapply(dflist, makeNamedZoo) 
    names(ListOfZoos) <- paste( sub("DAT$", "", names(dflist) ), "zoo", sep="")
    
    $dfone.zoo
    2011-01-01 2011-01-02 2011-01-03 2011-01-04 2011-01-05 2011-01-06 2011-01-07 
     0.7869056  1.6523928 -1.1131432  1.2261783  1.1843587  0.2673762 -0.4159968 
    2011-01-08 2011-01-09 2011-01-10 
    -1.2686391 -0.4135859 -1.4916291 
    
    $dftwo.zoo
    2011-01-01 2011-01-02 2011-01-03 2011-01-04 2011-01-05 2011-01-06 2011-01-07 
     0.7356612 -0.1263861 -1.6901240 -0.6441732 -1.4675871  2.3006544  1.0263354 
    2011-01-08 2011-01-09 2011-01-10 
    -0.8577544  0.6079986  0.6625564 
    

    【讨论】:

      【解决方案2】:

      这是实现我需要的更简单的方法:

      tozoo <- function(x) zoo(x$temp, x$date) 
      data1.zoo <- do.call(merge, lapply(split(data1, data1$Filename), tozoo))
      

      结果是一个漂亮的动物园对象。

      【讨论】:

        猜你喜欢
        • 2019-03-29
        • 2014-11-15
        • 1970-01-01
        • 2023-03-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-13
        • 2023-04-10
        相关资源
        最近更新 更多