希望在不知道位置的情况下转换多列的类别。
这是数据集
# 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;类“日期”无法定义
代码有什么问题,解决方案是什么?
答案 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