2017-06-30 53 views
2

與文件名的圈我有這樣的文件列表:對於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

回答

2

刪除了擴展名「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

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

這是因爲我需要使用循環內的函數。即使有一個功能,它會工作嗎? 'source(「functionE.R」)' – dede

+0

取決於你的函數..如果它沒有接受向量輸入,你可以做一個簡單的函數循環或更好的使用'sapply'或'lapply' – Val

1

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

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