我注意到已经有几次使用日期不允许使用R中的常用技巧。假设我有数据框数据和日期(见下文),我想将完整的数据框转换为日期类。我能想出的唯一解决方案是:
for (i in 1:ncol(Data)){
Data[,i] <- as.Date(Data[,i],format="%d %B %Y")
}
这为数据框提供了正确的结构:
> str(Data)
'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 ...
使用经典的应用方法可以提供完全不同的东西。虽然所有变量属于同一个类并且属于同一个类,但我无法将正确类的数据框或矩阵作为输出:
> 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"
如果要在Date对象中再次转换这些矩阵,则需要一个原点。该起源可能因系统而异,因此在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")
答案 0 :(得分:4)
我认为最简洁的方法是:
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)))
这是一个更冗长,但有一个优点,你不需要自己弄清楚数据格式。
答案 1 :(得分:2)
怎么样
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 ...