2017-10-17 214 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") 
相關問題