2017-10-17 219 views
2

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

它在哪儿示数?它看起来像你的日期格式行应该是ddf $日期< - as.Date(日期,格式=“%Y%m%d”) – User632716

+0

>错误:'\ d'是一个无法识别的转义字符串开始“”( \ d“ > as.Date中的错误(日期,格式=”%m /%d /%y“): 未找到对象'日期' –

回答

3

你可以使用这个命令:

transform(df, Date = as.Date(sub(".*\\D(\\d{4})_?(\\d{2})_?(\\d{1,2}).*", 
           "\\1\\2\\3", Filename), "%Y%m%d")) 
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"不正确的规范会给你NA在Date值而as.Date(Date, ...不正确的引用将引发你的错误。

您还可以使用str_extractstringrlubridate提取日期和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" 
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") 
相关问题