2011-07-21 25 views
1

我有一个系数向量x看起来像这样:转换因子最新与空单元格

"" 
"1992-02-13" 
"2011-03-10" 
"" 
"1998-11-30" 

我可以此向量转换为(使用as.Date())的日期载体?

尝试明显的方式给了我:

> x <- as.Date(x) 
Error in charToDate(x) : 
character string is not in a standard unambiguous format 

目前,我解决这个问题是这样的:

> levels(x)[1] <- NA 
> x <- as.Date(x) 

但是,这并不显得过于优雅...

先谢谢你!

回答

7

你只需要告诉as.Date什么格式的特征向量的期望:

xd <- as.Date(x, format="%Y-%m-%d") 
xd 
[1] NA   "1992-02-13" "2011-03-10" NA   "1998-11-30" 

To illustrate that these are indeed dates: 
xd[3] - xd[2] 
Time difference of 6965 days 

PS。无论您的数据是字符矢量还是因子,使用as.Date进行的这种转换都可以工作。

+0

+1间接指出as.Date()转换为字符。 –

2

当您在与read.csv,或其它数据拉,你可以设置

read.csv(...,na.strings=c("")) 

,以避免处理这个完全。

+0

这对我来说更棒!谢谢! – speendo

1

我通常使用函数strptime将因子转换为POSIX *类。第一个参数是你的向量,第二个参数是构造日期/时间的“模式”(%符号+特定字母)。你基本上告诉R,首先你有一年,然后你有 - ,然后一个月等等。有关转换规范的完整列表,请参阅?strptime

x <- factor(c("1992-02-13", "2011-03-10", "1998-11-30")) 
(x.date <- strptime(x, format = "%Y-%m-%d")) 
[1] "1992-02-13" "2011-03-10" "1998-11-30" 
class(x.date) 
[1] "POSIXlt" "POSIXt" 

同样的原理适用于as.Date。你告诉R“让它成为一个日期/时间对象,这里是如何制作它的说明”。

(as.Date(x, "%Y-%m-%d")) 
[1] "1992-02-13" "2011-03-10" "1998-11-30" 
+1

这是一个危险的习惯,因为它引入了时区的细微差错的可能性。一般来说,最好避免日期使用POSIXt类。 –

+0

@G。格洛腾迪克,还有什么替代方案? –

+0

@RL,看到这个职位的其他答案。他们不使用POSIXt类。 –