在R函数中传递数据框的多个列名

时间:2014-03-07 13:58:44

标签: r

我有一个包含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来提取各列的值,因此我想以自然的方式而不是字符串传递列名。我希望我能清楚地表达我的意图。

2 个答案:

答案 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)