通过在 R 中提取部分文件名来改变新列

Mutating new column by extracting parts of a file name in R

我在一个文件夹中有多个名称格式不同的 .xlsx 文件。我想将 R 中的一个新列变为以下格式:YYMMDD_wk#。以下是具有不同名称格式的三个文件的列表。唯一的区别是某些周被格式化为小数,例如 wk2.1

1.) 220128_B4_Height_performance_wk1

2.) 220204_SQ_Height_rerun_performance_plateD_wk44

3.) 220208_B4_Height_performance_noWeight_wk2.1

我只想要文件的第一部分和最后一部分,如 YYMMDD_wk# 所示。我的代码为新列提供了 NA。

performance <- list.file(path ="/Users/Desktop/performance", pattern= "*.xlsx", full.names=T) %>%
    setNames(nm = .) %>%
    lapply(read_excel) %>%
    bind_rows(.id = "Week") %>%
    mutate(Week = as.factor(str_extract(Week, "(\d+)_wk(\d+\.?\d*)")))

您可以使用此代码:

performance <- list("220128_B4_Height_performance_wk1", "220204_SQ_Height_rerun_performance_plateD_wk44" ,"220208_B4_Height_performance_noWeight_wk2.1")

第一个select第一个_之前的所有内容:

first <- sub("\_.*", "", performance)

输出:

[1] "220128" "220204" "220208"

第二个 select 最后一个 _ 之后的所有内容:

second <- sub('.+_(.+)', '\1', performance)

输出:

[1] "wk1"   "wk44"  "wk2.1"

最后使用此代码合并第一部分和第二部分:

paste(first, second, sep = "_")

输出:

[1] "220128_wk1"   "220204_wk44"  "220208_wk2.1"

使用stringr::str_replace_all()

library(stringr)
# example data with directories and file exts
Week <- c(
  "dir\220128_B4_Height_performance_wk1.xlsx",
  "dir\220204_SQ_Height_rerun_performance_plateD_wk44.xlsx",
  "dir\220208_B4_Height_performance_noWeight_wk2.1.xlsx"
)

str_replace_all(basename(Week), "(\d*)_.*(_wk\d*)\..*", "\1\2")
#> [1] "220128_wk1"  "220204_wk44" "220208_wk2"

reprex package (v2.0.1)

创建于 2022-03-14

解释:

  1. basename() 删除文件名前的路径
  2. (\d*)_.* 捕获第一个下划线之前的所有内容
  3. (_wk\d*)\..* 通过第一个周期捕获 _wk#
  4. "\1\2" 只保留那两个捕获的组。