我发现有关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
但是,也许那里有这种解决方法也失败了这样的情况?
在这种情况下是否有预期会失败的列名称列表?
用户定义函数或加载库是否会导致相同的错误?
是否有一个更安全的方式来做到这一点,我应该使用?
它看起来像在1.9.4熟悉的错误。升级或在其周围放置括号,如'dt [(class == 3),mean(value)]''。顺便说一句,如果你可以让你的例子只用几行工作,为什么不呢?如果你必须去100,请记住使用'set.seed'。 – Frank
对不起,如果这个例子太大了。我在回答我打开的另一个问题(看起来您刚刚迁移到Stats?)时遇到了这个问题。我不认为100是一个很大的数字,因为我只是将它从1000000中删除。不知道为什么你建议set.seed ---行数与选择种子有什么关系?或者是你的观点(正确),在没有set.seed()的情况下,确切的数字是不可重现的? –
“正确”?对了谢谢。在这种情况下'set.seed'的意义在于,人们可以确认达到了预期的结果。 “你为什么不呢?”我的意思是提醒你最好在这里写出最简单的例子......并且可以想到为什么在这种情况下的一个原因:如果你的例子足够小,它可以作为问题的一部分打印,使读者更快掌握你在做什么并试图去做。嘿,那正是我所做的。继续前进并遵循你自己的判断。 – Frank