5

我已经导入了一个包含多个日期的 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 返回日期列表,但我想要一个日期向量。

4

2 回答 2

8

在这种特定情况下,我相信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.callwithc将列表转换为向量。

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"

顺便说一句,使用Tand Ffor TRUEandFALSE有点令人担忧,因为TandF可以重新分配,而TRUEandFALSE不能重新分配。

于 2013-01-21T23:54:59.357 回答
1

不确定这是否是最好的方法,但该origin函数as.Date是默认日期格式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"
于 2013-01-21T23:49:27.403 回答