2012-07-03 65 views
0

我正在使用名稱非常相似(df1,df2,.. df7)的data.frames。因爲大部分分析都會完成,所以我想盡可能自動化這個過程。我已經設法在讀取文件時使用分配:在函數中使用循環調用具有相似名稱的對象R

for(i in 1:7) { 
    NameFile <- paste("df",i,"_10/score.out", sep="") 
    OutFile <- read.table(NameFile, na.string="NA",header=TRUE,sep="\t") 
    NameVar <- paste("df",i,"_10", sep="") 
    assign(NameVar, OutFile) 
    } 

但是現在我也想在它們中執行操作/函數。例如子集:

for(i in 1:7) { 
       Newname <- paste("dfsmall",i,sep="") 
       dftemp <- subset(df[i], p == 0 & abs(sepscore) > 0.3) 
       assign(Newname, dftemp) 
       } 

我認爲大部分是正確的,但是如何調用df [i]?也就是說,已經存在的名稱爲df1,df2(..)的對象?有沒有更好的方法來做到這一點?

這裏有一些類似的問題,但沒有一個會適合我的問題。然後再次,我很容易錯過顯而易見的。

謝謝。

+0

這可能對你有用:http://stackoverflow.com/questions/5158830/identify-all-objects-of-given-class-for-further-processing – Chase

+0

有趣的追逐。特別是,我不知道可以使用lapply從對象列表中生成圖(lapply(outList,plot))。再一次,我對lapply感到不舒服。 – fridaymeetssunday

回答

4

通過使用功能get(工作方式相同assign,但反向):

for(i in 1:7) { 
      get(paste("df",i,"_10",sep="")) -> df 
      Newname <- paste("dfsmall",i,sep="") 
      dftemp <- subset(df, p == 0 & abs(sepscore) > 0.3) 
      assign(Newname, dftemp) 
      } 
+0

它像一個魅力工作!我在其他帖子中閱讀了get函數,但無法完全獲得使用權。乾杯! – fridaymeetssunday

3

假設你有一個分析,由於某種原因,有10個組件,我不叫他們df1df10,但爲了在列表:

data_list = list(exp1 = data.frame(...), 
       exp2 = data.frame(...), 
       ..., 
       exp10 = data.frame(...)) 

現在正執行一個操作的所有實驗包括編寫執行的操作的功能,給出了一個元素的數據:

do_stuff = function(experiment_data) { 
    # do something 
} 

,並使用apply風格的循環,在這種情況下lapply

result = lapply(data_list, do_stuff) 

我覺得這種做法是很容易。

+0

對我來說太複雜了,因爲我並不特別喜歡或不知道名單。我瞭解他們的優勢,但我還沒有完成。謝謝你,我會牢記這一點。 – fridaymeetssunday

+3

@ krespim,學習列表,學習lapply。從長遠來看(甚至是中短跑),它會讓你的生活更輕鬆,避免出現問題。看看Paul的答案,關鍵部分是1行,該行比使用assign更危險。 –

+0

我同意,分配的解決方案很難閱讀imo。使用assign和get不那麼透明,並且更容易出錯。 –

相關問題