在 R 中使用文件名进行循环
For loop with file names in R
我有一个文件列表,例如:
nE_pT_sbj01_e2_2.csv
,
nE_pT_sbj02_e2_2.csv
,
nE_pT_sbj04_e2_2.csv
,
nE_pT_sbj05_e2_2.csv
,
nE_pT_sbj09_e2_2.csv
,
nE_pT_sbj10_e2_2.csv
如您所见,除了'sbj'(主题编号)不连续外,其他文件的名称相同。
我需要运行一个for循环,但我想保留原来的题目编号。这该怎么做?
我假设我需要将 length(file)
替换为保留主题原始编号的内容,但不确定该怎么做。
setwd("/path")
file = list.files(pattern="\.csv$")
for(i in 1:length(file)){
data=read.table(file[i],header=TRUE,sep=",",row.names=NULL)
source("functionE.R")
Output = paste("e_sbj", i, "_e2.Rdata")
save.image(Output)
}
上面的代码给出了输出:
e_sbj1_e2.Rdata
,e_sbj2_e2.Rdata
,e_sbj3_e2.Rdata
,
e_sbj4_e2.Rdata
,e_sbj5_e2.Rdata
,e_sbj6_e2.Rdata
.
相反,我想获得:
e_sbj01_e2.Rdata
,e_sbj02_e2.Rdata
,e_sbj04_e2.Rdata
,
e_sbj05_e2.Rdata
,e_sbj09_e2.Rdata
,e_sbj10_e2.Rdata
.
如果使用正则表达式和sprintf
(或paste0
),不用循环就可以轻松搞定:
fls <- c('nE_pT_sbj01_e2_2.csv', 'nE_pT_sbj02_e2_2.csv', 'nE_pT_sbj04_e2_2.csv', 'nE_pT_sbj05_e2_2.csv', 'nE_pT_sbj09_e2_2.csv', 'nE_pT_sbj10_e2_2.csv')
sprintf('e_%s_e2.Rdata',regmatches(fls,regexpr('sbj\d{2}',fls)))
[1] "e_sbj01_e2.Rdata" "e_sbj02_e2.Rdata" "e_sbj04_e2.Rdata" "e_sbj05_e2.Rdata" "e_sbj09_e2.Rdata" "e_sbj10_e2.Rdata"
您可以轻松地将向量提供给一个函数(如果可能的话),或者使用 sapply
或 lapply
将函数提供给向量
fls_new <- sprintf('e_%s_e2.Rdata',regmatches(fls,regexpr('sbj\d{2}',fls)))
res <- lapply(fls_new,function(x) yourfunction(x))
删除扩展名 "csv",然后添加 "Rdata",并在循环中使用文件名,例如:
myFiles <- list.files(pattern = "\.csv$")
for(i in myFiles){
myDf <- read.csv(i)
outputFile <- paste0(tools::file_path_sans_ext(i), ".Rdata")
outputFile <- gsub("nE_pT_", "e_", outputFile, fixed = TRUE)
save(myDf, file = outputFile)
}
注意:我更改了你的变量名,尽量避免使用函数名作为变量名。
如果我理解正确,您只需将扩展名从 .csv 更改为 .Rdata,删除最后一个“_2”并将前缀从 "nE_pT" 更改为 "e"。如果是,这应该有效:
Output = sub("_2.csv", ".Rdata", sub("nE_pT, "e", file[i]))
我有一个文件列表,例如:
nE_pT_sbj01_e2_2.csv
,
nE_pT_sbj02_e2_2.csv
,
nE_pT_sbj04_e2_2.csv
,
nE_pT_sbj05_e2_2.csv
,
nE_pT_sbj09_e2_2.csv
,
nE_pT_sbj10_e2_2.csv
如您所见,除了'sbj'(主题编号)不连续外,其他文件的名称相同。
我需要运行一个for循环,但我想保留原来的题目编号。这该怎么做?
我假设我需要将 length(file)
替换为保留主题原始编号的内容,但不确定该怎么做。
setwd("/path")
file = list.files(pattern="\.csv$")
for(i in 1:length(file)){
data=read.table(file[i],header=TRUE,sep=",",row.names=NULL)
source("functionE.R")
Output = paste("e_sbj", i, "_e2.Rdata")
save.image(Output)
}
上面的代码给出了输出:
e_sbj1_e2.Rdata
,e_sbj2_e2.Rdata
,e_sbj3_e2.Rdata
,
e_sbj4_e2.Rdata
,e_sbj5_e2.Rdata
,e_sbj6_e2.Rdata
.
相反,我想获得:
e_sbj01_e2.Rdata
,e_sbj02_e2.Rdata
,e_sbj04_e2.Rdata
,
e_sbj05_e2.Rdata
,e_sbj09_e2.Rdata
,e_sbj10_e2.Rdata
.
如果使用正则表达式和sprintf
(或paste0
),不用循环就可以轻松搞定:
fls <- c('nE_pT_sbj01_e2_2.csv', 'nE_pT_sbj02_e2_2.csv', 'nE_pT_sbj04_e2_2.csv', 'nE_pT_sbj05_e2_2.csv', 'nE_pT_sbj09_e2_2.csv', 'nE_pT_sbj10_e2_2.csv')
sprintf('e_%s_e2.Rdata',regmatches(fls,regexpr('sbj\d{2}',fls)))
[1] "e_sbj01_e2.Rdata" "e_sbj02_e2.Rdata" "e_sbj04_e2.Rdata" "e_sbj05_e2.Rdata" "e_sbj09_e2.Rdata" "e_sbj10_e2.Rdata"
您可以轻松地将向量提供给一个函数(如果可能的话),或者使用 sapply
或 lapply
fls_new <- sprintf('e_%s_e2.Rdata',regmatches(fls,regexpr('sbj\d{2}',fls)))
res <- lapply(fls_new,function(x) yourfunction(x))
删除扩展名 "csv",然后添加 "Rdata",并在循环中使用文件名,例如:
myFiles <- list.files(pattern = "\.csv$")
for(i in myFiles){
myDf <- read.csv(i)
outputFile <- paste0(tools::file_path_sans_ext(i), ".Rdata")
outputFile <- gsub("nE_pT_", "e_", outputFile, fixed = TRUE)
save(myDf, file = outputFile)
}
注意:我更改了你的变量名,尽量避免使用函数名作为变量名。
如果我理解正确,您只需将扩展名从 .csv 更改为 .Rdata,删除最后一个“_2”并将前缀从 "nE_pT" 更改为 "e"。如果是,这应该有效:
Output = sub("_2.csv", ".Rdata", sub("nE_pT, "e", file[i]))