【问题标题】:R apply function returns numeric value on date variablesR应用函数返回日期变量的数值
【发布时间】:2018-03-03 15:15:21
【问题描述】:

我有一个具有日期序列的 R 数据框。我想从包含一个月前日期的现有数据框创建一个数据框。 例如让 x 成为初始数据帧

x = data.frame(dt = c("28/02/2000","29/02/2000","1/03/2000","02/03/2000"))

我需要的数据框 y 是

y = c("28/01/2000","29/01/2000","1/02/2000","02/02/2000")

列表很大,所以我不想循环。我创建了一个内联函数,当我给出单独的日期时它可以正常工作。

datefun <- function(x) seq(as.Date(strptime(x,format = "%d/%m/%Y")), length =2, by = "-1 month")[2]

datefun("28/02/2000") gives "28/01/2000" as an output

但是当我在 R 中使用它时,它会给出随机数值。

apply(x,1,function(x) datefun(x))

这个的输出是

[1] 10984 10985 10988 10989

我不知道这些数字是从哪里生成的,我是否遗漏了什么。

【问题讨论】:

    标签: r date dataframe apply


    【解决方案1】:

    我相信 R 在内部将您的日期存储为自 UNIX 纪元(即 1970 年 1 月 1 日)以来经过的时间。您可以使用具有适当来源的 as.Date 轻松地将更新的日期查看为可读字符串,例如

    y <- apply(x,1,function(x) datefun(x))
    as.Date(y, origin='1970-01-01')
    
    [1] "2000-01-28" "2000-01-29" "2000-02-01" "2000-02-02"
    

    这里的要点是,您看到的数字输出可能会误导您认为您的日期信息不知何故丢失了。相反,日期以数字格式存储,您可以告诉 R 如何将这些信息视为日期。

    Demo

    【讨论】:

      【解决方案2】:

      您不应使用apply,因为结果将作为矩阵返回。 R 中的矩阵不能存储 Date 类的值。您必须改用lapply。这将返回结果列表。这些结果可以与Reducec 结合,创建一个Date 向量。

      Reduce(c, lapply(x$dt, datefun))
      # [1] "2000-01-28" "2000-01-29" "2000-02-01" "2000-02-02"
      

      【讨论】:

      • 解决真正问题的唯一答案
      【解决方案3】:

      您也可以使用lubridate 跳过您的功能:

      require(lubridate)
      format(dmy(x$dt) %m+% months(-1),"%d/%m/%Y")
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-09-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多