如何创建从R中的另一列获取日期的列?

如何创建从R中的另一列获取日期的列?,r,regex,date,dplyr,R,Regex,Date,Dplyr,我有一个由几列组成的数据框,最后一列称为文件名。这就是它的样子 Product Company Filename … … mg-tvd_bmmh_20170930.csv … … mg-tvd_bmmh_2016_06_13.csv … … … 我正在尝试用R编写一个简短的脚本,它从文件名中提取日期,并将其转换为一个新列,我称之为日期。因此,新的数据帧将如下所示:

我有一个由几列组成的数据框,最后一列称为
文件名
。这就是它的样子

    Product Company Filename
       …        …       mg-tvd_bmmh_20170930.csv
       …        …       mg-tvd_bmmh_2016_06_13.csv
       …        …       …
我正在尝试用R编写一个简短的脚本,它从文件名中提取日期,并将其转换为一个新列,我称之为
日期
。因此,新的数据帧将如下所示:

     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")

您可以使用以下命令:

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")
format=“%m/%d/%y”
的不正确规范将在
Date
中为您提供NA值,而
as.Date(Date,
的不正确引用将引发错误

您还可以使用
stru extract
from
stringr
提取日期,并使用
ymd
from
lubridate
将其解析为日期对象:

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
的优点是它“…识别任意非数字分隔符,也可以不识别分隔符…”,因此在解析之前不需要标准化
日期
字符向量。例如

> df$Filename %>% str_extract("\\d{4}_?\\d{2}_?\\d{2}(?=\\.csv)")
[1] "20170930"   "2016_06_13"

您显示的错误源于正则表达式中的特殊字符需要在R中进行双转义(例如,
\d
应该是
\\d
)。我建议对正则表达式部分使用
sub
,以便您可以控制输出,并添加通配符(
*
)如果有或没有下划线(如您的示例所示),则在下划线之后获取匹配项

中的格式设置为.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")

df哪里出错?看起来您的日期格式行应该是ddf$date>Error:“\d”是字符串中无法识别的转义符,以“.”(\d“>as.date(date,format=“%m/%d/%y”):找不到对象“date”
  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
> df$Filename %>% str_extract("\\d{4}_?\\d{2}_?\\d{2}(?=\\.csv)")
[1] "20170930"   "2016_06_13"
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")