如何使用R批量处理文件

免责声明:运行下面的代码可能会对你的电脑和文件造成不可恢复的损害,请确认明白代码的意义后再运行! 本主对代码运行后果不负任何责任。

1 基本函数

1.1 文件操作函数

这类函数很多,下面列出的是基本安装包(base)中的一些:

ls("package:base", pattern="^file\\.")
##  [1] "file.access"  "file.append"  "file.choose"  "file.copy"   
##  [5] "file.create"  "file.exists"  "file.info"    "file.link"   
##  [9] "file.mode"    "file.mtime"   "file.path"    "file.remove" 
## [13] "file.rename"  "file.show"    "file.size"    "file.symlink"

常用的有:

  • file.exists:检查文件是否存在
  • file.copy:文件拷贝
  • file.remove:文件删除
  • file.rename:文件重命名
  • file.size:获取文件大小(B)
  • file.info:获取文件信息(包括文件大小),结果为列表或数据框
  • file.path:构造文件路径

但最常用的一个函数可能是list.files,此函数的作用是列出指定目录(路径)中的文件:

str(list.files)
## function (path = ".", pattern = NULL, all.files = FALSE, full.names = FALSE, 
##     recursive = FALSE, ignore.case = FALSE, include.dirs = FALSE, 
##     no.. = FALSE)
  • path:文件路径,默认为“.”,即当前工作目录(getwd()获得)
  • pattern:文件名过滤模式,使用正则表达式
  • all.files:是否列出所有文件(含隐藏文件)
  • full.names:文件名是否以包含文件路径的“全名”形式表示
  • recursive:是否递归查找目录(查找子目录)
  • ignore.case:指定的模式(pattern参数)是否忽略大小写
  • include.dirs:是否包含目录名(多数系统认为“目录”也是“文件”)

1.2 字符(串)操作函数

这里仅介绍两个:gsub和strsplit。

我们将用gsub这个函数从文件名中提取需要的信息。它的用法是:

str(gsub)
## function (pattern, replacement, x, ignore.case = FALSE, perl = FALSE, 
##     fixed = FALSE, useBytes = FALSE)
  • pattern:查找模式,使用正则表达式
  • replacement:替换模式,可使用正则表达式
  • x:待处理的字符(串)向量
  • ignore.case:指定的模式(pattern参数)是否忽略大小写
  • fixed:模式(pattern参数)不使用正则表达式

strsplit的作用是使用指定分隔符切割字符串:

str(strsplit)
## function (x, split, fixed = FALSE, perl = FALSE, useBytes = FALSE)

它的结果是一个列表,如果应用于字符串向量,最好是结合apply函数使用:

xnames <- c("T-1-a", "T-2-b")
strsplit(xnames, "-")
## [[1]]
## [1] "T" "1" "a"
## 
## [[2]]
## [1] "T" "2" "b"
apply(cbind(xnames), 1, FUN = function(x) strsplit(x, "-")[[1]])
##      [,1] [,2]
## [1,] "T"  "T" 
## [2,] "1"  "2" 
## [3,] "a"  "b"

2 从文件名提取信息

可以使用strsplit函数。例如获取文件扩展名:

ffs <- list.files(pattern = "\\.")
apply(cbind(ffs), 1, FUN = function(x) rev(strsplit(x, "\\.")[[1]])[1])

当然也可以使用gsub函数:

gsub("^.+\\.([^\\.]+$)", "\\1", ffs)

想要从文件名中提取出有用信息,首先文件名中得存在有用信息,而这得取决于你的文件命名习惯。如果你是做科学的人,建议文件名中包含样品、重复、时间等信息。使用一定的规则命名文件,这在后期数据处理中非常有用。

3 批量重命名文件

基本过程是:

  • 用list.files函数获取原文件名
  • 构造新文件名
  • 用file.rename重命名文件

下面代码把当前目录下的Temp子目录下的txt文件用编号进行重命名:

ffo <- list.files(path="Temp", pattern = "\\.txt", full.names = TRUE)
if ( length(ffo) > 0) {
    ffn <- paste0(1:length(ffo), ".txt")
    ffn <- file.path("Temp", ffn)
    file.rename(ffo, ffn)
}

下面的代码把当前目录下的文件名的扩展名转成大写:

ffo <- list.files(pattern = "\\..+$")
fs1 <- gsub("^(.+\\.)([^\\.]+$)", "\\1", ffo)
fs2 <- gsub("^(.+\\.)([^\\.]+$)", "\\2", ffo)
ffn <- paste0(fs1, toupper(fs2))
file.rename(ffo, ffn)

4 批量选择和删除文件

可根据文件信息选择文件,然后再删除。这时候file.info函数就很有用了:

xsel <- file.info(ffs)$size < 10
if (sum(xsel) > 0) file.remove(ffs[xsel])

5 批量读取文件数据

通常使用for循环进行读取,例如:

dtx <- NULL
for (ff in ffs) dtx <- cbind(dtx, read.csv(ff))
colnames(dtx) <- ffs

但这同样取决于你的文件和数据。文件名的命名要讲究规律,存储格式也要标准化!如果做不到这一点,请不要说你在做科学。


作者: ZGUANG@LZU

Created: 2018-10-24 三 10:29

 

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 撸撸猫 设计师:C马雯娟 返回首页