我有一個包含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來提取不同列的值,因此我想以自然方式而不是字符串傳遞列名。我希望我能夠清楚地表達我的意圖。
@Ananda,據我所知,「aa」與「myFunc」簽名中的參數y相匹配。我不清楚的是「沒有錯誤,因爲列aa匹配y,但bb是另一列報告錯誤」。我無法理解函數調用簽名中的(aa for y)和(bb for ...)之間的語義差異,因爲aa和bb都是同一數據幀的列。我可以通過使用eval/substitute/envir的組合來訪問myFunc中的aa。 – kishore
@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
@Ananda:我已經重寫了我的問題,並且讓代碼讓我繼續。你使用'match.call'的答案讓我開始了。 +1爲您的詳細解釋。 – kishore