无法将因子转换为日期

时间:2014-01-09 15:18:42

标签: r date

我有这样的数据框:

    > a=runif(5)
    > b=c("1-Jan-13", "2-Jan-13", "3-Jan-13", "4-Jan-13", "5-Jan-13")
    > dd = data.frame(a,b)
    > dd 
          a        b
1 0.1873622 1-Jan-13
2 0.1902314 2-Jan-13
3 0.7476141 3-Jan-13
4 0.3584118 4-Jan-13
5 0.2152858 5-Jan-13

    > str(dd)
'data.frame':   5 obs. of  2 variables:
 $ a: num  0.187 0.19 0.748 0.358 0.215
 $ b: Factor w/ 5 levels "1-Jan-13","2-Jan-13",..: 1 2 3 4 5

我试过

    > dd$b <- as.Date(dd$b, format="%d/%m/%Y")
    > str(dd)
'data.frame':   5 obs. of  2 variables:
 $ a: num  0.187 0.19 0.748 0.358 0.215
 $ b: Date, format: NA NA NA NA ...

 > dd = data.frame(a,b)
 > dd$b <- as.Date(dd$b, format="%d-%m-%Y")
 > str(dd)
'data.frame':   5 obs. of  2 variables:
 $ a: num  0.187 0.19 0.748 0.358 0.215
 $ b: Date, format: NA NA NA NA ...

不起作用......

2 个答案:

答案 0 :(得分:1)

@rawr,@ joran和@ SimonO'Hanlon都是现货。本机R解决方案看起来像:

a <- runif(5)
b <- c("1-Jan-13", "2-Jan-13", "3-Jan-13", "4-Jan-13", "5-Jan-13")
dd <- data.frame(a, b=as.Date(b, format="%d-%b-%y"))
str(dd)
## 'data.frame':    5 obs. of  2 variables:
##  $ a: num  0.947 0.997 0.39 0.913 0.178
##  $ b: Date, format: "2013-01-01" ...

%b是月份名称的简短版本,%y表示没有世纪的年份。

OR

您可以安装spiffy lubridate软件包,并使用真正ymd()函数来确定字符串的格式。

install.packages("lubridate")
library(lubridate)

dd <- data.frame(a, b=dmy(b))
str(dd)
## 'data.frame':    5 obs. of  2 variables:
##  $ a: num  0.947 0.997 0.39 0.913 0.178
##  $ b: POSIXct, format: "2013-01-01" ...

只要您使用POSIXct类型与Date类型相比,您接下来所做的一切都很酷,那么您就是金色的。

正如@joran所说的那样,对?strptime进行调查并没有什么坏处。

答案 1 :(得分:-1)

> dd
      a        b
1 0.2102705 1-Jan-13
2 0.9018757 2-Jan-13
3 0.4113829 3-Jan-13
4 0.2685403 4-Jan-13
5 0.4664033 5-Jan-13


> str(dd)
'data.frame':   5 obs. of  2 variables:
$ a: num  0.21 0.902 0.411 0.269 0.466
$ b: Factor w/ 5 levels "1-Jan-13","2-Jan-13",..: 1 2 3 4 5

我将月份格式从%m更改为%b,年份从%Y更改为%y,然后就可以了。

> str(dd)
'data.frame':   5 obs. of  2 variables:
$ a: num  0.21 0.902 0.411 0.269 0.466
$ b: Date, format: "2013-01-01" "2013-01-02" "2013-01-03" "2013-01-04" ...