簡體   English   中英

對於文件名在R中的循環

[英]For loop with file names in R

我有一個文件列表,如:

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

刪除擴展名“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)
}

注意:我更改了變量名,盡量避免使用函數名作為變量名。

如果你使用正則表達式和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))

如果我理解正確,您只需將.csv的擴展名更改為.Rdata,刪除最后一個“_2”並將前綴從“nE_pT”更改為“e”。 如果是,這應該工作:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM