根据R中的文件名创建一个新字段

时间:2015-06-21 23:46:58

标签: r dataframe

我有许多.csv文件,它们都包含同一目录中的相同字段,但每个文件中的值都是针对特定日期的。但是,.csv文件中的数据不包含日期 - 只有文件名包含日期。

我目前正在使用以下代码读入和合并不同的.csv文件:

group <- list.files(pattern="[.]csv")
fun <- function(x) {
  df <- read.csv(x , header = TRUE)
}
big_df <- ldply(group, fun)

输出看起来像这样:

print(big_df)
  value_a value_b value_c
1       1     444      10
2       5    7364       9
3      32     573      14
4       7     253      16

并且它正在读取的文件如下所示:

print(group)
[1] "PSM_filter_report_04242015_1.csv" "PSM_filter_report_04242015_2.csv" "PSM_filter_report_04252015_1.csv"
[4] "PSM_filter_report_04272015_1.csv"

作为流程的一部分,我想要做的是使用substr()或一些类似的功能,将文件名中的日期添加为我创建的文件中的新字段。通过这样做,新数据框将如下所示:

big_df
  value_a value_b value_c     date
1       1     444      10 04242015
2       5    7364       9 04242015
3      32     573      14 04252015
4       7     253      16 04272015

只要将日期作为因素或字符读入(这样我就不会失去前导零),我会很乐意使用as.Date()转换日期。

2 个答案:

答案 0 :(得分:1)

这将是获得你想要的东西的方法之一。由于您有一种系统的方式来表示时间信息(即日期信息有八位数字),您可以这样做。

library(stringr)

group <- c("PSM_filter_report_04242015_1.csv","PSM_filter_report_04242015_2.csv",
           "PSM_filter_report_04252015_1.csv", "PSM_filter_report_04272015_1.csv")

str_extract(group, "[0-9]{8}")

# [1] "04242015" "04242015" "04252015" "04272015"

然后,您可以稍后将此字符串转换为日期。希望这会对你有所帮助。

答案 1 :(得分:0)

您可以在基础R中执行相同操作,而无需使用外部库。由于日期长度为8,格式为'%m%d%Y',因此以下代码可以正常使用。

# assuming only csv files are of interest
group <- list.files(path = '.', pattern=".csv$")
dates <- substr(group, regexpr('\\d', group), regexpr('\\d', group)+8-1)
dates <- strptime(dates, '%m%d%Y')
dates <- as.POSIXct(dates) #if you need POSIXct objects

您可以直接从位置替换regexpr来电,即from=19, to=26

HTH