【问题标题】:Dates with lapply and sapplylapply 和 sapply 的日期
【发布时间】:2013-01-21 23:38:22
【问题描述】:

我导入了一个包含多个日期的 CSV 文件,并使用 as.Date 函数来转换日期。但是,当我使用 mapply 函数查找两个日期中的较早日期时,我要么得到一个包含日期的列表,要么得到一个数字向量。如何获取带日期的向量?

POP.Start.final <- mapply(min, combinedOM$Cons.Start.Date.y, 
                               combinedOM$OS.Start.Date.y, 
                                MoreArgs = list(na.rm=T),SIMPLIFY=T)

这会返回一个数字向量,更改为 SIMPLIFY=F 会返回一个日期列表,但我想要一个日期向量。

【问题讨论】:

    标签: r


    【解决方案1】:

    在这种特定情况下,我相信 pmin 可以解决问题:

    POP.Start.final <- pmin(combinedOM$Cons.Start.Date.y,
      combinedOM$OS.Start.Date.y,
      na.rm=TRUE)
    

    在一般情况下,SIMPLIFY=TRUE(默认)使用实用函数simplify2array 通过as.vector 将列表转换为原子模式的向量。因为日期在内部存储为数字,SIMPLIFY=TRUE 会将日期列表转换为模式数字向量并删除 Date 类。您可以设置SIMPLIFY=FALSE 以保留Date 类,然后使用do.callc 将列表转换为向量。

    POP.Start.final <- do.call(c,mapply(min, combinedOM$Cons.Start.Date.y, 
                                   combinedOM$OS.Start.Date.y, 
                                    MoreArgs = list(na.rm=TRUE),SIMPLIFY=FALSE))
    

    一些可重现的代码:

    a <- as.Date(c("2012-01-11","2012-06-30","2012-04-18"))
    b <- as.Date(c("2013-04-21","2012-03-22","2012-05-01"))
    pmin(a,b)
    #[1] "2012-01-11" "2012-03-22" "2012-04-18"
    do.call(c,mapply(min,a,b,MoreArgs=list(na.rm=TRUE),SIMPLIFY=FALSE))
    #[1] "2012-01-11" "2012-03-22" "2012-04-18"
    

    顺便说一句,将TF 用于TRUEFALSE 有点令人担忧,因为TF 可以重新分配,而TRUEFALSE 不能重新分配。

    【讨论】:

    • 哎呀。你的答案是第一个,但它看起来比需要的更复杂。我稍后会删除我的。
    • 不用担心。当一个漂亮的基础功能不可用时,我试图覆盖基础,所以我们的答案可以是互补的。
    • 您对为什么将日期转换为数字的解释有些不妥。 SIMPLIFY=TRUE 调用simplify2array,将其参数转换为向量或矩阵,is.vector(Sys.Date())FALSE。它与“最简单的类型”没有任何关系。
    • @JoshuaUlrich 已编辑。这更有意义吗?
    • @BlueMagister:是的;不能在 for 循环中使用日期也是同样的问题:日期不是严格的向量。
    【解决方案2】:

    不确定这是否是最好的方法,但as.Date 函数的origin 默认日期格式是January 1, 19701970-01-01

    所以(用虚构的数据代替你的),这将起作用:

    > one <- as.Date("2012-01-01")
    > two <- as.Date("2012-03-13")
    > 
    > POP.Start.final <- as.Date(
                                 mapply(min,
                                        one,
                                        two,
                                        MoreArgs=list(na.rm=T)
                                       ),
                                        origin="1970-01-01"
                                )
    > str(POP.Start.final)
     Date[1:1], format: "2012-01-01"
    

    【讨论】:

      猜你喜欢
      • 2010-11-26
      • 2023-03-06
      • 2013-10-31
      • 1970-01-01
      • 1970-01-01
      • 2019-03-29
      • 2015-02-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多