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

时间:2017-10-17 12:13:31

标签: r regex date grep dplyr

我有几列的数据框,最后一列称为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

3 个答案:

答案 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中的stringrymd中提取日期和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")