对于文件名在R中的循环

时间:2017-06-30 08:49:19

标签: r loops filenames

我有一个文件列表,如:

nE_pT_sbj01_e2_2.csvnE_pT_sbj02_e2_2.csvnE_pT_sbj04_e2_2.csvnE_pT_sbj05_e2_2.csvnE_pT_sbj09_e2_2.csvnE_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.Rdatae_sbj2_e2.Rdatae_sbj3_e2.Rdatae_sbj4_e2.Rdatae_sbj5_e2.Rdatae_sbj6_e2.Rdata

相反,我想获得:

e_sbj01_e2.Rdatae_sbj02_e2.Rdatae_sbj04_e2.Rdatae_sbj05_e2.Rdatae_sbj09_e2.Rdatae_sbj10_e2.Rdata

3 个答案:

答案 0 :(得分:3)

删除扩展名" 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)
}

注意:我更改了变量名,尽量避免将函数名用作变量名。

答案 1 :(得分:1)

如果你使用正则表达式和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"

您可以轻松地将矢量提供给函数(如果可能),或者使用sapplylapply

将函数提供给矢量
fls_new <- sprintf('e_%s_e2.Rdata',regmatches(fls,regexpr('sbj\\d{2}',fls)))

res <- lapply(fls_new,function(x) yourfunction(x))

答案 2 :(得分:1)

如果我理解正确,您只需将.csv的扩展名更改为.Rdata,删除最后一个&#34; _2&#34;并从&#34; nE_pT&#34;更改前缀到&#34; e&#34;。如果是,这应该有效:

Output = sub("_2.csv", ".Rdata", sub("nE_pT, "e", file[i]))