Datetime 如何将字符的数据帧转换为相应的日期?

Datetime 如何将字符的数据帧转换为相应的日期?,datetime,r,apply,Datetime,R,Apply,我已经注意到有几次使用date不允许使用R中的常用技巧。比如说,我有一个带有日期的dataframe数据(见下文),我想将完整的dataframe转换为date类。到目前为止,我唯一能想到的解决方案是: for (i in 1:ncol(Data)){ Data[,i] <- as.Date(Data[,i],format="%d %B %Y") } 使用经典的apply方法会带来完全不同的结果。虽然所有变量都属于同一类,并且都属于同一类,但我无法获得正确类的数据帧或矩阵作为输出

我已经注意到有几次使用date不允许使用R中的常用技巧。比如说,我有一个带有日期的dataframe数据(见下文),我想将完整的dataframe转换为date类。到目前为止,我唯一能想到的解决方案是:

for (i in 1:ncol(Data)){
    Data[,i] <- as.Date(Data[,i],format="%d %B %Y")
}
使用经典的apply方法会带来完全不同的结果。虽然所有变量都属于同一类,并且都属于同一类,但我无法获得正确类的数据帧或矩阵作为输出:

> str(sapply(Data,as.Date,format="%d %B %Y"))
 num [1:6, 1:4] 12898 12898 13907 13907 13907 ...
 - attr(*, "dimnames")=List of 2
  ..$ : NULL
  ..$ : chr [1:4] "Rep1" "Rep2" "Rep3" "Rep4"
> str(apply(Data,2,as.Date,format="%d %B %Y"))
 num [1:6, 1:4] 12898 12898 13907 13907 13907 ...
 - attr(*, "dimnames")=List of 2
  ..$ : NULL
  ..$ : chr [1:4] "Rep1" "Rep2" "Rep3" "Rep4"
如果要在日期对象中再次变换这些矩阵,则需要原点。源代码可能因系统而异,因此在apply()之后使用as.Date或其他函数也没有多大帮助。如果应用原点,将再次获得向量

有人能为这类数据提供一个干净的解决方案吗?下面是我在示例中使用的数据帧

Data <- structure(list(Rep1 = c(" 25 April 2005 ", " 25 April 2005 ", 
" 29 January 2008 ", " 29 January 2008 ", " 29 January 2008 ", 
" 29 January 2008 "), Rep2 = c(" 10 May 2006 ", " 10 May 2006 ", 
" 4 December 2008 ", " 4 December 2008 ", " 4 December 2008 ", 
" 4 December 2008 "), Rep3 = c(" 28 March 2007 ", " 28 March 2007 ", 
" 6 April 2009 ", " 6 April 2009 ", " 6 April 2009 ", " 6 April 2009 "
), Rep4 = c(" 14 November 2007 ", " 14 November 2007 ", " 1 March 2010 ", 
" 1 March 2010 ", " 1 March 2010 ", " 1 March 2010 ")), .Names = c("Rep1", 
"Rep2", "Rep3", "Rep4"), row.names = c("1", "2", "3", "4", "5", 
"6"), class = "data.frame")
数据怎么样

str(as.data.frame(lapply(Data,as.Date,format="%d %B %Y")))
# 'data.frame':   6 obs. of  4 variables:
#  $ Rep1:Class 'Date'  num [1:6] 12898 12898 13907 13907 13907 ...
#  $ Rep2:Class 'Date'  num [1:6] 13278 13278 14217 14217 14217 ...
#  $ Rep3:Class 'Date'  num [1:6] 13600 13600 14340 14340 14340 ...
#  $ Rep4:Class 'Date'  num [1:6] 13831 13831 14669 14669 14669 ...

我认为最简洁的方法是:

Data[] <- lapply(Data, as.Date,format="%d %B %Y")

Data[]该死,我怎么能忽视这一点。谢谢
apply
对于这种后台转换非常烦人,例如,为了完整性,请参阅:如果您想要一个矩阵作为结果,Marek在另一个线程中提供了此解决方案:Out我经常使用它来删除
数据中的几列。frame
一次:
数据[date\u col]
Data[] <- lapply(Data, as.Date,format="%d %B %Y")
Data[date_col] <- lapply(Data[date_col], as.Date,format="%d %B %Y")
library(stringr)
library(lubridate)
Data[] <- lapply(Data, function(x) dmy(str_trim(x)))