【问题标题】:Apply and lubridate涂抹并润滑
【发布时间】:2016-07-04 08:28:25
【问题描述】:

日期转换有问题。如果我在应用中使用 ymd,它会返回一个数字,或者如果我只使用 ymd,它就可以工作。 有人会知道吗?

library(lubridate)
a <- data.frame(dates1=c("2011-01-01",'2011-02-01','2011-03-01'),
            dates2=c("2013-01-01",'2013-02-01','2013-03-01'))
apply(a, 2, FUN = function(x) ymd(x))

     dates1     dates2
[1,] 1293840000 1356998400
[2,] 1296518400 1359676800
[3,] 1298937600 1362096000

ymd(a$dates1)

[1] "2011-01-01 UTC" "2011-02-01 UTC" "2011-03-01 UTC"

ymd(a$dates2)

[1] "2013-01-01 UTC" "2013-02-01 UTC" "2013-03-01 UTC"

【问题讨论】:

  • 使用lapply(),因为apply() 将Date 类降为数字。你真的应该只将apply() 与矩阵一起使用。

标签: r date lubridate


【解决方案1】:

使用lapply():

lapply(a, function(x) ymd(x))

更新/说明

apply() 文档指出:

在所有情况下,结果都由 as.vector 在设置维度之前强制转换为基本向量类型之一,因此(例如)因子结果将被强制转换为字符数组。

正如 J.Ulrich 在 cmets 中对 this answer 所说的那样,“日期不是严格的向量”。 lapply()apply() 非常相似,但是它将返回一个列表而不是一个向量。因此它能够处理日期。

【讨论】:

    【解决方案2】:

    apply 尝试简化它,如果输入 X 是二维的,则使用 as.matrix,请参见以下示例:

    as.matrix(ymd("2013-01-01"))
          [,1]
    [1,] 15706
    

    ?apply

    详情
    如果 X 不是数组而是具有非空暗淡的类的对象 值(例如数据框),应用尝试将其强制为数组 如果它是二维的(例如,数据帧),则通过 as.matrix 或通过 as.array.

    【讨论】:

      【解决方案3】:

      这是一个使用mutate_each的选项

      library(dplyr)
      a %>%
          mutate_each(funs(ymd))
      #     dates1     dates2
      #1 2011-01-01 2013-01-01
      #2 2011-02-01 2013-02-01
      #3 2011-03-01 2013-03-01
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-10-20
        • 2011-04-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-23
        相关资源
        最近更新 更多