我有一个包含70多列的数据框。我需要分别使用每一列对多个列执行一些重复计算。
根据@ 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 :(得分:1)
我得到了这个(很可能是这样):使用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"
你在评论中的后续内容非常不清楚,所以我将尝试用一个例子来解释。
在下面,我为函数添加了一个“y”参数,为了演示,让我们只返回列表中的相关值。
myFunc <- function(data, y, ...) {
argList <- as.character(match.call(expand.dots=FALSE)$...)
list(y, argList)
}
如果我们在使用函数时没有指定“y =
”部分,则R假定第二个值应该用于“y
”,而所有其他值应该用于“...
” {1}}”。
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
”。
答案 1 :(得分:0)
因为aa,bb和cc不存在。它需要知道它们存在于df:
中myFunc(df, df$aa, df$bb)
myFunc(df, df$aa, df$bb, df$cc)