将数字转换为日期

时间:2016-07-13 17:11:38

标签: r reshape2 tidyr

我的数据以这种格式显示

ID     Date       Order
1   12/12/2015      1
1   12/13/2015      2
1   12/14/2015      3
1   12/15/2015      4
2   12/12/2015      1
2   12/13/2015      2
2   12/14/2015      3
2   12/15/2015      4

现在,我正在使用tidyr将数据转换为宽格式。所以新数据看起来像这样。

ID   Date_1     Date_2       Date_3    Date_4
1  12/12/2015 12/13/2015  12/14/2015 12/15/2015
2  12/12/2015 12/13/2015  12/14/2015 12/15/2015

我遇到的问题是转换时,Date_1,Date_4正在变为数字。当我尝试使用以下代码将它们转换为字符时,我收到以下错误。

df[, 2:5] <- lapply(df[,2:5], as.Date)

错误:

Error in as.Date.numeric(x) : 'origin' must be supplied

我的问题是如何将数字数据转换为日期格式。

谢谢!

1 个答案:

答案 0 :(得分:1)

我们需要使用正确的format将其转换为Date类。

df[2:5] <- lapply(df[2:5], as.Date, format = "%m/%d/%Y")
df
#  ID     Date_1     Date_2     Date_3     Date_4
#1  1 2015-12-12 2015-12-13 2015-12-14 2015-12-15
#2  2 2015-12-12 2015-12-13 2015-12-14 2015-12-15

如果“日期”列已经采用"%Y-%m-%d"格式,那么我们不必指定格式。

目前尚不清楚我们如何在重塑

时获得数字“日期”列
library(tidyr)
OrigDf %>% 
     mutate(Order = paste0("Date", Order)) %>% 
     spread(Order, Date)
#  ID      Date1      Date2      Date3      Date4
#1  1 12/12/2015 12/13/2015 12/14/2015 12/15/2015
#2  2 12/12/2015 12/13/2015 12/14/2015 12/15/2015

注意:即使是factor列,上述输出也保持不变。

数据

df <- structure(list(ID = 1:2, Date_1 = c("12/12/2015", "12/12/2015"
), Date_2 = c("12/13/2015", "12/13/2015"), Date_3 = c("12/14/2015", 
"12/14/2015"), Date_4 = c("12/15/2015", "12/15/2015")), .Names = c("ID", 
"Date_1", "Date_2", "Date_3", "Date_4"), class = "data.frame",
 row.names = c(NA, -2L))


Origdf <- structure(list(ID = c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L), 
 Date = c("12/12/2015", 
 "12/13/2015", "12/14/2015", "12/15/2015", "12/12/2015", "12/13/2015", 
 "12/14/2015", "12/15/2015"), Order = c(1L, 2L, 3L, 4L, 1L, 2L, 
 3L, 4L)), .Names = c("ID", "Date", "Order"), class = "data.frame",
 row.names = c(NA, -8L))