偶尔,我会将Microsoft Excel中的数据读入R.在Excel中,日期变量的格式正确(例如2017年12月31日) . 读入R后,相同的日期变量将转换为另一种格式(例如2017-12-31) .
我的数据框样本(在读入R之后)如下所示:
df <- structure(list(ID = c("001", "002", "003", "004", "005"),
t1_date = structure(c(1490227200, 1508198400, 1511395200, 1527292800, 1485216000),
class = c("POSIXct", "POSIXt"), tzone = "UTC"),
t2_date = structure(c(1524009600, NA, NA, NA, 1523232000),
class = c("POSIXct", "POSIXt"), tzone = "UTC"),
t3_date = c(NA, NA, NA, NA, NA),
t4_date = c(NA, NA, NA, NA, NA),
t5_date = c(NA, NA, NA, NA, NA)),
.Names = c("ID", "t1_date", "t2_date", "t3_date", "t4_date", "t5_date"),
row.names = c(NA, -5L), class = c("tbl_df", "tbl", "data.frame"))
使用t1_date变量作为示例,我可以将POSIXct类(R为我选择的)中的每个日期列单独转换为Date类,然后使用以下代码更改格式:
df$t1_date <- as.Date(df$t1_date)
df$t1_date <- format(df$t1_date, "%d-%b-%Y")
但是,我有许多日期列,它们可能在数据框中彼此不相邻 .
通常,为了解决这些问题,我使用 which
和 apply
函数来选择相关列并将函数应用于它们:
df[, which(colnames(df) == "t1_date"):
which(colnames(df) == "t5_date")] <-
apply(df[, which(colnames(df) == "t1_date"):
which(colnames(df) == "t5_date")], 2, function(x) as.Date(x, format = "%d-%b-%Y"))
上面的代码导致了所有日期列中的NAs,我不确定为什么 . 即使我不强制更改格式,但将日期列从POSIXct类转换为Date类,代码仍然不起作用(见下文):
df[, which(colnames(df) == "t1_date"):
which(colnames(df) == "t5_date")] <-
apply(df[, which(colnames(df) == "t1_date"):
which(colnames(df) == "t5_date")], 2, as.Date)
我想要的结果是将日期转换为DD-MMM-YYYY格式(例如2017年12月31日) .
帮助赞赏 . 谢谢!
1 回答
我们选择要格式化的列范围,然后根据我们的要求使用
as.Date
然后format
将它们转换为日期 .使用
dplyr
,mutate_at
也可以实现同样的目的