2017-06-29 66 views
0

我想將這組命令轉換爲循環。如何將一組命令轉換爲R中的循環

sbj05_GD = load("ep_sbj05_GD.Rdata") 
sbj06_GD = load("ep_sbj06_GD.Rdata") 
sbj08_GD = load("ep_sbj08_GD.Rdata") 
sbj09_GD = load("ep_sbj09_GD.Rdata") 

sbj05_max <-max(sbj05_GD$A) 
sbj06_max <-max(sbj06_GD$A) 
sbj08_max <-max(sbj08_GD$A) 
sbj09_max <-max(sbj09_GD$A) 

max_sum <- rbind(sbj05_max,sbj06_max,sbj08_max,sbj09_max) 
max_sum <-as.data.frame(max_sum) 
colnames(max_sum) <- c("max") 
max_sum$sbj <- c("sbj05","sbj06","sbj08","sbj09") 

write.table(max_sum, file = "Ep_max_sum.txt",sep="\t",row.names=FALSE) 

我開始這樣的嘗試,這是不行的,但我什至不知道我怎麼能rbind在一個循環中的文件。

file=list.files("path/", pattern="*.Rdata", full.names="TRUE") 
for (i in 1:file){ 
data=load(file[i]) 
data_max[i] <-max(file[i]$A) 
} 

我不是很熟悉的循環,所以我會很感激,如果你可以建議如何處理,如果一個for循環是要走的路。

回答

0
file.codes <- c("05", "06", "08", "09") 
max_sum <- data.frame(sbj = file.codes, max = NA) 
for (i in file.codes) { 
    load(paste0("ep_sbj", i, "_GD.Rdata")) 
    max_sum[max_sum$sbj == i, "max"] <- max(obj$A) 
} 

第1行創建了一個文件代碼向量(它似乎是主題編號)。第2行創建數據框,您將在其中存儲所有內容。 for循環循環遍歷文件代碼,並根據文件代碼提取文件,然後在數據幀中將正確的位置賦予數據集所需的值。這假設使用load()創建了一個名爲「obj」的數據幀或列表;否則用其實際名稱替換obj。想必這對每個文件都是一樣的。有可能更有說服力的方法來做到這一點,但這一點很簡單。

在兩行,你可以這樣做:

file.codes <- c("05", "06", "08", "09") 
max_sum <- data.frame(sbj = file.codes, 
         max = sapply(file.codes, function(i) { 
          load(paste0("ep_sbj", i, "_GD.Rdata")) 
          return(max(obj$A)) 
          })) 

它採用sapply()而不是for循環。

根據@ 42的評論進行編輯。

+0

這可能不起作用。 R'load'命令不一定會返回適合分配給名稱的值。爲'load'返回的結果只是已加載的項目的_names_。不是它們的值。如果你想保存一個文件並且賦值給一個名字,那麼它必須用'saveRDS'保存。 –

+0

你說得對。 'load()'就足夠了,沒有賦值給'temp'。編輯。 – Noah

+0

很高興認識到這一點。但是你聲稱你的代碼可以在任何情況下工作也是錯誤的。 –