【问题标题】:How to use wildcard in file path name for pattern matching in R?如何在文件路径名中使用通配符在 R 中进行模式匹配?
【发布时间】:2021-10-05 09:47:07
【问题描述】:

我有一个包含我的 rproj 的目录和一个用于所有输出的“数据”文件夹。数据文件夹中有 40 个子目录,每个子目录包含一个“output.csv”。子目录的名称完全不同,但都以 1 或 2 结尾。

data/****1/output.csv
data/****2/output.csv

星号代表名称的不同部分(不同数量的字母),我需要的每个 csv 都有完全相同的名称。

我需要根据其子目录是否以 1 或 2 结尾,将所有“output.csv”单独列出,并且我一直在尝试使用 grep() 函数

allOutputFiles <- list.files(pattern = "output.csv", recursive = TRUE, full.names = TRUE)

files1 <- grep(pattern = "./data/1$", allOutputFiles, value = TRUE)
files2 <- grep(pattern = "./data/2$", allOutputFiles, value = TRUE)

但是每次我运行它时,它都会返回character(0)。如果我在 1$ 前添加一个“\”,它将返回 invalid regular expression './data/\1$', reason 'Invalid back reference'

如何正确地将通配符应用于不同的文件路径?

【问题讨论】:

    标签: r directory filepath grepl


    【解决方案1】:

    我们可以使用dirname获取父目录,然后gsub提取它的最后一个字符。然后我们用split将文件名用这一个字母隔开。

    # allOutputFiles <- c("data/****1/output.csv","data/****2/output.csv")
    allOutputFiles <- list.files(pattern = "output.csv", recursive = TRUE, full.names = TRUE)
    gsub(".*(.)$", "\\1", dirname(allOutputFiles))
    # [1] "1" "2"
    out <- split(allOutputFiles, gsub(".*(.)$", "\\1", dirname(allOutputFiles)))
    out
    # $`1`
    # [1] "data/****1/output.csv"
    # $`2`
    # [1] "data/****2/output.csv"
    

    如果您想对此进行索引,请使用 out[["1"]] 进行索引(而 out[[1]] 在这里可以方便地使用,这是基于您选择的最后一个字母的巧合,不应依赖)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多