【问题标题】:expanding a dataframe within a function using a date sequence使用日期序列在函数中扩展数据框
【发布时间】:2013-07-06 00:48:03
【问题描述】:

我正在尝试获取一个数据框并将其扩展为函数内的面板数据。

require(lubridate)
require(plyr)

df <- data.frame(group = seq(1, 10))

f <- function(df, sdate, edate) {
  df <- ddply(df, .(group), transform, year = year(seq(ymd(sdate), ymd(edate), by = "year")))
  return(df)
}

f(df, "1945-1-1", "2013-1-1")

这会引发错误:Error in lapply(list(...), .num_to_date) (from #3) : object 'sdate' not found

似乎sdateedate 被正确传递并且在函数中具有正确的类型。

【问题讨论】:

    标签: r plyr lubridate


    【解决方案1】:

    另一种选择是使用do.callcall 在“sdate”和“edate”可见的环境中构造调用:

    f <- function(df, sdate, edate) {
      df <- do.call("ddply",list(df, "group", transform, 
                           year = call("year",x= seq(ymd(sdate), 
                                              to = ymd(edate), by = "year"))))
      return(df)
    }
    
    f(df, "1945-1-1", "2013-1-1")
        group year
    1       1 1945
    2       1 1946
    3       1 1947
    4       1 1948
    5       1 1949
    6       1 1950
    7       1 1951
    8       1 1952
    

    编辑

    plyr 风格的解决方案(更简单)

    你应该使用plyr::here

    此函数捕获当前上下文,使其更易于使用 **ply 使用执行特殊评估并需要访问调用 ddply 的环境的函数。

    f <- function(df, sdate, edate) {
       ddply(df, .(group), plyr::here(transform), 
                                 year = year(seq(ymd(sdate), ymd(edate), by = "year")))
    }
    

    【讨论】:

      【解决方案2】:

      这就是范围界定的问题。 这是一个解决方法:

      > f <- function(df, sdate, edate) {
      +   df <- ddply(df, .(group), 
      +               function(x) data.frame(year = year(seq(ymd(sdate), ymd(edate), by = "year"))))
      +   return(df)
      + }
      > 
      > head(f(df, "1945-1-1", "2013-1-1"))
        group year
      1     1 1945
      2     1 1946
      3     1 1947
      4     1 1948
      5     1 1949
      6     1 1950
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-06-28
        • 2021-05-12
        • 1970-01-01
        • 2019-04-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多