如何在不知道索引R的情况下在多列中应用as.Date函数

时间:2018-03-28 03:29:06

标签: r lapply as.date

希望在不知道位置的情况下转换多列的类别。

这是数据集

# Dataset name call : df . # It is a example , real data has many columns
# that you cannot have a clear index by one sight.

A.Date      Price  B.Date       C.Date      Size    D.Date
2017-01-01   502   2017-01-03   2017-11-01   45.4   2016-10-01
2015-01-31   602   2017-02-03   2013-07-11   65.4   2016-03-24

我有一个如下代码:

 df[,grepl("Date",colnames(df))] <-
 lapply(df[,grepl("Date",colnames(df))],function(x) as.Date(x))

但结果是错误:

Error in strptime(x, f) : input string is too long

即使我尝试了这段代码:

 DateCol <- grep("Date",names(df)) 
 df[,c(DateCol)] <- as.Date(df[,c(DateCol)])

它再次出错了 as.Date.default(df [,c(DateCol)])出错:    &#39; df [,c(DateCol)]&#39;类“日期”无法定义

代码有什么问题,解决方案是什么?

2 个答案:

答案 0 :(得分:1)

如果你的xxx.Date列是字符,那么

library(dplyr)

txt <- "A.Date      Price  B.Date       C.Date      Size    D.Date
2017-01-01   502   2017-01-03   2017-11-01   45.4   2016-10-01
2015-01-31   602   2017-02-03   2013-07-11   65.4   2016-03-24"

dat <- read.table(text = txt, header = TRUE)

res <- dat %>% 
  mutate_if(is.character, as.Date)
str(res)  

> str(res)
'data.frame':   2 obs. of  6 variables:
 $ A.Date: Date, format: "2017-01-01" ...
 $ Price : int  502 602
 $ B.Date: Date, format: "2017-01-03" ...
 $ C.Date: Date, format: "2017-11-01" ...
 $ Size  : num  45.4 65.4
 $ D.Date: Date, format: "2016-10-01" ...

reprex package(v0.2.0)创建于2018-03-27。

答案 1 :(得分:1)

虽然@Tung已经提供了一个很好的解决方案,但我觉得dplyr::mutate_at在这种情况下应该是更合适的选择,因为列预计会更改为Date 包含Date作为其名称的一部分。因此,如果数据框包含其他character类型列,那么mutate_at将提供灵活性来选择列。

grep("Date",names(.), value = TRUE)提供了列表,其中包含Date作为其名称的一部分。

mutate_at应用as.Date函数将这些列转换为Date类型。

library(dplyr)

df %>%
  mutate_at(vars(grep("Date",names(.), value = TRUE)), funs(as.Date))

#      A.Date Price     B.Date    C.Date Size     D.Date
#1 2017-01-01   502 2017-01-03 2017-11-01 45.4 2016-10-01
#2 2015-01-31   602 2017-02-03 2013-07-11 65.4 2016-03-24