vlambda博客
学习文章列表

人人都该学会的R语言批量处理文件技能!

基本函数

文件操作函数

这类函数很多,下面列出的是基本安装包(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:是否包含目录名(多数系统认为“目录”也是“文件”)

字符(串)操作函数

这里仅介绍两个: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"

从文件名提取信息

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

ffs <- list.files(pattern = "\\.")
apply(cbind(ffs), 1, FUN = function(x) rev(strsplit(x, "\\.")[[1]])[1])
当然也可以使用gsub函数:

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

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

批量重命名文件

基本过程是:
用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)

批量选择和删除文件

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

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

批量读取文件数据

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

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

但这同样取决于你的文件和数据。文件名的命名要讲究规律,存储格式也要标准化!如果做不到这一点,请不要说你在做科学。
————————————————
版权声明:本文为CSDN博主「金子哦」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u014801157/java/article/details/83340046

如有侵权,请联系删除。

免责声明:本文所有内容均来自网络,我们对文中观点保持中立,对所包含内容的准确性、可靠性或者完整性不提供任何明示或暗示的保证,并不对文章观点负责。版权属于原作者。