2013-01-16 57 views
1

我嘗試計算R中不同組的不同組的列方法,並且創建包含不同分組的兩列。在一個函數內循環並自動創建對象R

# create a test df 
    df.abcd.2<-data.frame(Grouping1=c("a","f","a","d","d","f","a"),Grouping2=c("y","y","z","z","x","x","q"),Var1=sample(1:7),Var2=sample(1:7),Var3=rnorm(1:7)) 
    df.abcd.2 

現在,我創建了一個循環與分配,lapply,分裂和colMeans得到我的結果,並存儲在不同勢DFS。循環工作正常。

#Loop to create the colmeans and store them in dataframes 
    for (i in 1:2){ 
     nam <- paste("RRRRRR",deparse(i), sep=".") 
     assign(nam, as.data.frame(
     lapply(
      split(df.abcd.2[,3:5], df.abcd.2[,i]), colMeans) 
    ) 
    ) 
    } 

所以,現在我想創建一個函數來應用此方法在不同的數據框上。我學嘗試是這樣的:

# 1. function to calculate colMeans for diffrent groups 
    # df= desired datatframe, 
    # a=starting column: beginning of the columns that contain the groups, b= end of columns that contain the groups 
    # c=startinc column: beginning of columns to be analized, d=end of columns do be analized 

    function.split.colMeans<-function(df,a,b,c,d) 
    {for (i in a:b){ 
     nam <- paste("OOOOO",deparse(i), sep=".") 
     assign(nam, as.data.frame(
     lapply(
      split(df[,c:d], df[,i]), colMeans) 
    ) 
    ) 
    } 
    } 
    #test the function 
    function.split.colMeans(df.abcd.2,1,2,3,5) 

所以,當我測試這個功能,我沒有得到一個錯誤信息,也不結果...誰能幫助我,好嗎?

+1

你確定你真的想把結果存儲在不同的對象嗎?我在這裏的兩分錢將是做所有事情。 –

+0

@RomanLuštrik。我理解你是否正確,你會編寫一個循環來將所有結果存儲在一個列表中?我試圖遵循你的建議,並使用plyr軟件包中的dlply。所以我的函數看起來像'function.list <-function(x,a,b){for(i in a:b){dlply(x,。(x [,i]),colwise(mean))}} '。但不幸的是,它不能用於循環。你能提供更多的信息嗎? – Joschi

回答

1

它的工作完美。閱讀分配幫助。瞭解框架和環境。

換句話說,它在你的函數中創建變量,但是當你在命令行執行ls()時,它們不會泄露到你看到的環境中。如果你把print(ls())放在你的函數循環中,你會看到它們,但是當函數結束時,它們會消失。

通常情況下,函數與其調用環境交互的唯一方式是返回值。任何其他方法正在進入一個痛苦的世界。

不要使用assign來創建具有順序或信息名稱的東西。永遠。除非你知道你在做什麼,你不知道......把它們粘在列表中,然後你可以爲零件編制索引等等。