从列表中创建data.frame变量

时间:2013-09-15 15:46:49

标签: r

是否可以“通过引用”为对象创建名称并为其指定名称? 例如,我有一个大型的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”的空数据框。

我尝试过与eval(parse(text=paste("by_","nbhd", sep=""))) = data.frame("nbhd"=NA)类似的内容,但收到错误。

任何人都知道这是否可行?任何帮助将不胜感激。提前谢谢。

1 个答案:

答案 0 :(得分:1)

不是要求“通过引用创建一个对象”,而是通过“按值调用”与“通过引用调用”之间的区别来提出各种无关的认知关联,而应该寻求“on /用语言“。大概你有一个数据集(你没有很好地描述),有一组名为“”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)
                              }
                               }
                                   }

不幸的是,这主要是未经测试的猜测,因为你没有产生一个可重复性最小的例子。