人人都该学会的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
如有侵权,请联系删除。
免责声明:本文所有内容均来自网络,我们对文中观点保持中立,对所包含内容的准确性、可靠性或者完整性不提供任何明示或暗示的保证,并不对文章观点负责。版权属于原作者。