如何创建一个从R中另一列获取日期的列?
问题描述:
我有一个数据框的几列,最后一个被称为Filename
。这是它的样子。如何创建一个从R中另一列获取日期的列?
Product Company Filename
… … mg-tvd_bmmh_20170930.csv
… … mg-tvd_bmmh_2016_06_13.csv
… … …
我想写R中很短的脚本,从文件名取日期,并将其转换成一个新的列,我称之为一个Date
。因此,一个新的数据框将如下所示:
Product Company Date Filename
… … 09/30/2017 mg-tvd_bmmh_20170930.csv
… … 16/13/2017 mg-tvd_bmmh_2016_06_13.csv
… … … …
这是我的脚本的相关部分。
df <- mutate(df, Date <- grep(pattern = "(\d{4})_?(\d{2})_?
(\d{1,2})", df$Filename, value = TRUE))
ddf$Date <- as.Date(Date,format = "%m/%d/%y")
任何意见,为什么我不能得到它的工作?
我得到这些错误:
Error: '\d' is an unrecognized escape in character string starting ""(\d" Error in as.Date(Date, format = "%m/%d/%y") : object 'Date' not found
答
你可以使用这个命令:
transform(df, Date = as.Date(sub(".*\\D(\\d{4})_?(\\d{2})_?(\\d{1,2}).*",
"\\1\\2\\3", Filename), "%Y%m%d"))
答
你得到,因为不是错误:
ddf$Date <- as.Date(Date,format = "%m/%d/%y")
你应该有:
df$Date <- as.Date(df$Date,format = "%Y/%m/%d")
或:
df %>%
mutate(Date = as.Date(df$Date,format = "%Y/%m/%d"))
的format = "%m/%d/%y"
不正确的规范会给你NA在Date
值而as.Date(Date, ...
不正确的引用将引发你的错误。
您还可以使用str_extract
从stringr
从lubridate
提取日期和ymd
将其解析到Date对象:
library(dplyr)
library(stringr)
library(lubridate)
df %>%
mutate(Date = ymd(str_extract(Filename, "\\d{4}_?\\d{2}_?\\d{2}(?=\\.csv)")))
数据:
Product Company Filename Date
1 1 3 mg-tvd_bmmh_20170930.csv 2017-09-30
2 2 4 mg-tvd_bmmh_2016_06_13.csv 2016-06-13
与ymd
的优点是,它“...识别任意的非数字分隔符以及没有分隔符...”因此,在解析之前不需要标准化Date
字符向量。例如,
> df$Filename %>% str_extract("\\d{4}_?\\d{2}_?\\d{2}(?=\\.csv)")
[1] "20170930" "2016_06_13"
答
告诉你是因为原正则表达式中的特殊字符必须转义双R中的错误(例如\d
应该是\\d
)。我建议使用sub
作为正则表达式部分,以便您可以控制输出,并在下划线之后添加通配符(*
)以获得匹配(如果存在或不存在下划线)(如您的示例所示)。
格式化在as.Date
想要一年的资本Y(%Y
)。
更新的代码如下:
df <- mutate(df, Date = sub(pattern = ".*_(\\d{4})_*(\\d{2})_*(\\d{1,2}).*", "\\2/\\3/\\1", df$Filename))
df$Date <- as.Date(df$Date,format = "%m/%d/%Y")
它在哪儿示数?它看起来像你的日期格式行应该是ddf $日期 User632716
>错误:'\ d'是一个无法识别的转义字符串开始“”( \ d“ > as.Date中的错误(日期,格式=”%m /%d /%y“): 未找到对象'日期' –