1

是否可以“通过引用”为对象创建和分配名称?比如我有一个很大的data.frame,我需要对里面的一些列做一些基本的操作。我将需要做的列、分组和操作放在列表中:

exec_group_list = c("nbhd", "state", "use")
exec_var_list   = c("land", "imp", "assmt", "landp", "impp", "assmtp")
exec_func_list  = c("sum", "mean", "median", "max", "min", "sd")

因此,“land”列将按“nbhd”分组,然后对其应用“sum”、“mean”、“median”等。然后对“imp”列执行相同的操作,依此类推。然后我将重复相同的操作,但这次分组将由“状态”完成......冲洗,车床并重复,如下所示:

for (eachg in exec_group_list){
  group_by_field = eachg
  group_by = eval(parse(text=paste("sales$",group_by_field)))
  group_by_lst = list(group_by)
  print(paste("Grouping by:", eachg))
  #CREATE DATA.FRAME FOR GROUP HERE
    for (eachv in exec_var_list){
      var = eval(parse(text=paste("sales$",eachv)))
      print(paste("On column:", eachv))
      for (eachf in exec_func_list){
    print(paste("Calculating:", eachf))
    tempt = (aggregate(var, group_by_lst, eachf))
    colnames(tempt) = c(eachg, paste(eachv,".",eachf, sep=""))
    print(tempt)
    #APPEND COLUMNS TO GROUP DATA.FRAME
      }
    }
  }

我想出了如何使用 eval() 使用列表中的引用,这样我就可以遍历分组列表和列列表,并使用列表中的值执行相同的操作。

但我想将信息存储在以分组字段命名的 data.frame 中。因此,例如,如果我按“nbhd”分组,我想创建一个名为“by_nbhd”的空 data.frame。

我尝试了类似的方法,eval(parse(text=paste("by_","nbhd", sep=""))) = data.frame("nbhd"=NA)但出现错误。

任何人都知道这是否可能?任何帮助将不胜感激。先感谢您。

4

1 回答 1

1

与其要求“通过引用创建对象”会引发各种与“按价值调用”和“按引用调用”之间的区别的无关认知关联,不如就“基于/使用语言进行计算”寻求帮助”。大概您有一个数据集(您没有很好地描述),其中包含一组名为“nbhd”、“state”和“use”的列,以及名为:“land”、“imp”、“assmt”的列, "landp", "impp", "assmtp"。您想在第二组的数字列(3 x 6 x 6 表)上连续检查第一组的 6 个类别中的 6 个排序的汇总统计信息。

编写一个函数原型,为特定函数、特定数值列和特定分类列提供一个汇总表。

 tabfn <- function(dfrm, numcol, catcol, fn){
                         tapply(dfrm[[numcol]], dfrm[[catcol]], fn) }

最简单的方法是创建一等函数列表,而不是eval(parsing(text=character-objects)

exec_func_list  = list(sum, mean, median, max, min, sd)
for (eachg in exec_group_list){
  print(paste("Grouping by:", eachg))
  for (eachv in exec_var_list){
     print(paste("On column:", eachv))
     for (eachfn in exec_func_list){
       print(paste("Calculating:", eachf))
       print(tabfn(dfrm, exec_var_list, exec_group_list, eachfn)
                              }
                               }
                                   }

不幸的是,这主要是未经测试的猜测,因为您没有生成最小的可重现示例。

于 2013-09-15T16:28:40.267 回答