2014-03-07 92 views
2

我有一個包含70列以上的數據幀。我需要使用每列分別執行一些重複計算。在R函數中傳遞數據幀的多個列名

基於@Ananda的方法和反饋,這裏是重寫簡單的例子和​​解決方案。我仍然保持舊線在年底話題的緣故,

問題:

> df = data.frame(aa=1:10, bb=101:110, cc=201:210, dd=301:310) 

> myFunc(df, aa, bb, cc) 
aa series sum is 55 
bb series sum is 1055 
cc series sum is 2055 

> myFunc(df, aa, dd) 
aa series sum is 55 
dd series sum is 3055 

> myFunc(df, dd) 
dd series sum is 3055 
> 
:使用其中列名被指定爲多個參數的函數,計算一個數據幀的各列的總和

而且myFunc的函數定義來完成,這是低於

myFunc = function(data, ...){ 
    argList = match.call(expand.dots=FALSE)$... 

    for(i in 1:length(argList)){ 
    colName = argList[[i]] 
    series_colName = eval(substitute(colName), envir=data, enclos=parent.frame()) 
    cat(colName, "series sum is", sum(series_colName), "\n") 
    } 
} 

這給了我一個起點,一起工作。如果有更好的方法來定義myFunc,請讓我知道。

感謝所有幫助

::::舊討論主題:

我還在盤算我的R中的方式,因此忍耐一下吧。下面的示例代碼模擬了我的第一次嘗試,並對我進行了轟炸。我在哪裏錯了,什麼是R-ish方式來做這種計算。請幫助

myFunc = function(data, y, ...){ 
    argList = list(...) 
    argList 
    #for each arg in argList 
    #do some processing with data, y and column arg 
} 

df = data.frame(aa=1:10, bb=101:110, cc=201:210, dd=301:310) 
myFunc(df, aa, bb) 
myFunc(df, aa, bb, cc) 

和錯誤消息是

Error in myFunc(df, aa, bb) : object 'bb' not found 

Error in myFunc(df, aa, bb, cc) : object 'bb' not found 

進一步增加,使其變得更加清晰。

myFunc(df, aa, c(2,4, 6)) 

工作正常。

我打算在進一步處理中使用eval,substitute和envir來提取不同列的值,因此我想以自然方式而不是字符串傳遞列名。我希望我能夠清楚地表達我的意圖。

+0

@Ananda,據我所知,「aa」與「myFunc」簽名中的參數y相匹配。我不清楚的是「沒有錯誤,因爲列aa匹配y,但bb是另一列報告錯誤」。我無法理解函數調用簽名中的(aa for y)和(bb for ...)之間的語義差異,因爲aa和bb都是同一數據幀的列。我可以通過使用eval/substitute/envir的組合來訪問myFunc中的aa。 – kishore

+0

@Ananda:這是一個可以正常工作的myFunc代碼示例。 myFunc = function(data,y,...) argList = list(...) series_y = eval(substitute(y),envir = data,enclos = parent.frame()) cat( 「sum of」,deparse(substitute(y)),「is」,sum(series_y),「\ n」) } – kishore

+0

@Ananda:我已經重寫了我的問題,並且讓代碼讓我繼續。你使用'match.call'的答案讓我開始了。 +1爲您的詳細解釋。 – kishore

回答

1

我得到了這個地方(最有可能的SO):使用match.call如下...

myFunc <- function(data, ...) { 
    argList <- as.character(match.call(expand.dots=FALSE)$...) 
    argList 
} 

myFunc(df, aa, bb) 
# [1] "aa" "bb" 
myFunc(df, aa, bb, cc) 
# [1] "aa" "bb" "cc" 

你followups中的註釋很不清楚,所以我會試着用一個例子來解釋。

在下面,我已經爲該函數添加了一個「y」參數,爲了演示,我們只需將相關值返回到列表中。

myFunc <- function(data, y, ...) { 
    argList <- as.character(match.call(expand.dots=FALSE)$...) 
    list(y, argList) 
} 

如果使用該功能時,我們不指定「y =」的一部分,R假定第二值應該用於「y」和所有其他值應該用於「...」。

myFunc(df, aa, bb) 
# Error in myFunc(df, aa, bb) : object 'aa' not found 
myFunc(df, y = NULL, aa, bb) 
# [[1]] 
# NULL 
# 
# [[2]] 
# [1] "aa" "bb" 

你沒有得到任何錯誤,因爲你的函數的版本沒有提及「y」。

0

因爲aa,bb和cc不存在。它需要知道他們在DF存在:

myFunc(df, df$aa, df$bb) 

myFunc(df, df$aa, df$bb, df$cc) 
+0

myFunc(df,aa,c(2,4,6))執行得很好。我不確定原因,但論證aa對於形式論證「y」適用,對「bb」,「cc」等論據的處理是「...」。我的R知識不是足以深入瞭解這一點。 – kishore

+0

你需要提供更多關於你想要做什麼的信息。當你在argList中有多個變量時,給我們一個你想從你的函數得到的輸出的例子。你想要這樣給出什麼輸出:myFunc(df,aa,bb) –

+0

我同意我需要更加表達我想要達成的目標。讓我工作一個更簡單的問題定義。在我這樣做之前,我需要按照上面的建議嘗試match.call路由。 – kishore

相關問題