R data.table 列名的保留字?
Reserved words for R data.table column names?
我在 data.table 中发现了一些关于特定列名称的尖锐边缘。我怎样才能避免被它们割伤自己?假设我有一个包含两列的 data.table,'type' 和 'value'。
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
但是如果 "someone who is not me" 出现并认为 '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
这是预期的行为(对于 OSX 上的 1.9.4)?我认为它发生是因为 'class' 是 R 中的函数名称,而 data.table 内部的某些东西正在这样解释它。将 i 子句括在括号中似乎可以解决问题:
dt[(class==3), mean(value)]
# [1] 0.08086124
但也许在某些情况下此解决方法也会失败?
是否有在这种情况下预计会失败的列名列表?
用户定义的函数或加载的库会导致同样的错误吗?
通常有没有我应该使用的更安全的方法?
这似乎已经修复了。更新您的 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
我在 data.table 中发现了一些关于特定列名称的尖锐边缘。我怎样才能避免被它们割伤自己?假设我有一个包含两列的 data.table,'type' 和 'value'。
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
但是如果 "someone who is not me" 出现并认为 '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
这是预期的行为(对于 OSX 上的 1.9.4)?我认为它发生是因为 'class' 是 R 中的函数名称,而 data.table 内部的某些东西正在这样解释它。将 i 子句括在括号中似乎可以解决问题:
dt[(class==3), mean(value)]
# [1] 0.08086124
但也许在某些情况下此解决方法也会失败?
是否有在这种情况下预计会失败的列名列表?
用户定义的函数或加载的库会导致同样的错误吗?
通常有没有我应该使用的更安全的方法?
这似乎已经修复了。更新您的 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