[更新】2年后,问题有人问...
在运行中的问题的代码,data.table
现在更乐于助人,回报这个(使用1.8.2):
Error in `[.data.table`(my.dt, , sum(dependent.variable), by = grouping.vars[i]) :
'by' appears to evaluate to column names but isn't c() or key(). Use by=list(...)
if you can. Otherwise, by=eval(grouping.vars[i]) should work. This is for efficiency
so data.table can detect which columns are needed.
并按照错误的第二句忠告:
my.dt[,sum(dependent.variable), by=eval(grouping.vars[i])]
sex V1
1: M 2650
2: F 2600
从2010年7月
老答案(by
现在可以double
和character
,虽然):
严格地说by
需求评估与存储模式整数时,每个向量的名单,虽然。所以数字矢量age
也可以使用as.integer()
强制为整数。这是因为data.table使用基数排序(非常快),但基数算法专门用于整数只有(请参阅维基百科的'基数排序'条目)。整数存储键列和特设by
是data.table速度快的原因之一。一个因素当然是对唯一字符串的整数查找。
by
是表达式的list()
背后的想法是,您不限于列名。通常在by
中直接编写表达式的列表名称。常见的是按月汇总;例如:
DT[,sum(col1), by=list(region,month(datecol))]
或通过yearmonth一个非常快速的方式来组是通过使用非划时代基于日期,如yyyymmddL在一些包中的例子看到的,这样的:
DT[,sum(col1), by=list(region,month=datecol%/%100L)]
请注意,您可以像这样命名列表()中的列。
定义和重用复杂的分组表达式:
e = quote(list(region,month(datecol)))
DT[,sum(col1),by=eval(e)]
DT[,sum(col2*col3/col4),by=eval(e)]
或者,如果你不想每次都重新评估by
表达式,可以一次保存的结果和重用效率的结果;如果by
表达式本身需要很长的时间来计算/分配,或者你需要重复使用很多次:
byval = DT[,list(region,month(datecol))]
DT[,sum(col1),by=byval]
DT[,sum(col2*col3/col4),by=byval]
请参阅http://datatable.r-forge.r-project.org/得到最新的信息和状态。一个新的演示文稿将很快出现在那里,并希望很快将1.5版发布到CRAN。这包含在NEWS文件中详细说明的几个错误修复和新功能。数据表帮助列表每月大约有30-40个帖子,这也许是有趣的。
你有两个“grouping.vars”,但是从1:5迭代。我在那里错过了什么? – Shane 2010-07-15 02:41:39
另外,在你的工作例子中,性是一个对象,而在你失败的版本中,它是一个角色。 – Shane 2010-07-15 02:49:24
嘿谢恩,对不起,修好了。应该是2不是5.那是我不清楚的,看来性是一个对象(??)。 – 2010-07-15 03:08:20