2015-09-06 75 views
1

我发现有关data.table中特定列名称的尖锐边缘。我怎样才能避免在他们身上割伤自己?假设我有一个data.table有两列,'type'和'value'。R data.table列名称的保留字?

numRows = 100 
numTypes = 10 
dt = data.table(type=sample(numTypes, numRows, replace=T), 
       value=rnorm(numRows)) 

如果我想看到快速计算出平均值与类型== 3的所有行,这个伟大的工程:

dt[type==3, mean(value)] 
# [1] 0.08086124 

但如果“人谁不是我”走过来决定那'type'对这个专栏来说是一个不好的名字,而且它确实应该是一个'class'?

setnames(dt, "type", "class") 

现在,当我尝试等价操作,我得到可怕的错误消息:

dt[class==3, mean(value)] 
# Error in setattr(attr(x, "index"), paste(cols, collapse = "__"), o) : 
# attempt to set invalid 'class' attribute 

我这个预期的行为(1.9.4在OSX)?我认为这是因为'class'是R中的一个函数名,而data.table内部的东西正在解释它。包裹我子句中括号似乎解决了问题:

dt[(class==3), mean(value)] 
# [1] 0.08086124 

但是,也许那里有这种解决方法也失败了这样的情况?

在这种情况下是否有预期会失败的列名称列表?

用户定义函数或加载库是否会导致相同的错误?

是否有一个更安全的方式来做到这一点,我应该使用?

+0

它看起来像在1.9.4熟悉的错误。升级或在其周围放置括号,如'dt [(class == 3),mean(value)]''。顺便说一句,如果你可以让你的例子只用几行工作,为什么不呢?如果你必须去100,请记住使用'set.seed'。 – Frank

+0

对不起,如果这个例子太大了。我在回答我打开的另一个问题(看起来您刚刚迁移到Stats?)时遇到了这个问题。我不认为100是一个很大的数字,因为我只是将它从1000000中删除。不知道为什么你建议set.seed ---行数与选择种子有什么关系?或者是你的观点(正确),在没有set.seed()的情况下,确切的数字是不可重现的? –

+1

“正确”?对了谢谢。在这种情况下'set.seed'的意义在于,人们可以确认达到了预期的结果。 “你为什么不呢?”我的意思是提醒你最好在这里写出最简单的例子......并且可以想到为什么在这种情况下的一个原因:如果你的例子足够小,它可以作为问题的一部分打印,使读者更快掌握你在做什么并试图去做。嘿,那正是我所做的。继续前进并遵循你自己的判断。 – Frank

回答

2

这似乎已经修复了。更新你的data.table包。

library(data.table) 
set.seed(1) 
numRows = 100 
numTypes = 10 
dt = data.table(type=sample(numTypes, numRows, replace=T), 
       value=rnorm(numRows)) 
setnames(dt,"type","class") 
dt[class==3, mean(value)] 
# [1] -0.2300146 
+0

已确认固定在1.9.5,谢谢! –