我有几列的数据框,最后一列称为Filename
。这就是它的样子。
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
答案 0 :(得分:3)
您可以使用此命令:
transform(df, Date = as.Date(sub(".*\\D(\\d{4})_?(\\d{2})_?(\\d{1,2}).*",
"\\1\\2\\3", Filename), "%Y%m%d"))
答案 1 :(得分:1)
您收到的错误是因为而不是:
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"
的错误说明会在Date
中为您提供NA值,而as.Date(Date, ...
的错误引用会引发错误。
您还可以使用str_extract
中的stringr
从ymd
中提取日期和lubridate
以将其解析为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
的优势在于它“...识别任意非数字分隔符以及没有分隔符......”因此无需标准化{{ 1}}解析前的字符向量。例如,
Date
答案 2 :(得分:0)
您显示的错误是由于正则表达式中的特殊字符需要在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")