我只想在 R 中使用 10 个文件。对于每个我想计算的东西。经验。文件:stat1_pwg1.out stat23_pwg2.out .. stat45_pwg10.out
我试试这个:
for (i in 1:10){
Data=paste("../XYZ/*_pwg",i,".out",sep="")
line=read.table(Data,head=T)
}
但它不起作用?有后遗症吗?
我只想在 R 中使用 10 个文件。对于每个我想计算的东西。经验。文件:stat1_pwg1.out stat23_pwg2.out .. stat45_pwg10.out
我试试这个:
for (i in 1:10){
Data=paste("../XYZ/*_pwg",i,".out",sep="")
line=read.table(Data,head=T)
}
但它不起作用?有后遗症吗?
我怀疑您的问题来自通配符*
。更好的方法可能是首先使用 存储文件名dir
,然后找到所需的文件名。
files <- dir("../XYZ",pattern="stat[0-9]+_pwg[0-9]+\.out")
for(f in files) {
line=read.table(Data,head=T)
}
您还可以使用apply
函数系列之一来完全消除 for 循环。
关于你的代码的一些事情。
paste
是矢量化的,因此您可以将其排除在循环之外。
paste("../XYZ/*_pwg", 1:10, ".out", sep = "")
(尽管您稍后会看到,您实际上根本不需要使用paste
。)
read.table
不接受通配符;它需要与文件名完全匹配。
与其尝试构建文件名的向量,不如使用dir
合适的命名方案来查找目录中存在的文件。
要过滤文件,请在模式参数中使用正则表达式。您可以使用 将通配符转换为正则表达式glob2rx
。
file_names <- dir("../XYZ", pattern = glob2rx("stat*_pwg*.out"))
data_list <- lapply(filenames, read.table, header = TRUE)
对于更具体的匹配,通配符只匹配数字而不是任何东西,您需要直接使用正则表达式。
file_names <- dir("../XYZ", pattern = "^stat[[:digit:]]+_pwg[[:digit:]]+\\.out$")
files <- dir(pattern="*Rip1_*")
files
for (F in files){ assign(F , Readfunc(F))}