我的数据以这种格式显示
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
我的问题是如何将数字数据转换为日期格式。
谢谢!
答案 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))