data.table 切换列名

JS1*_*204 6 r data.table

我想问一下以下行为data.table是功能还是错误。

鉴于 data.table

dt = data.table(
  group = c(rep('group1',5),rep('group2',5)),
  x = as.numeric(c(1:5, 1:5)),
  y = as.numeric(c(5:1, 5:1)),
  z = as.numeric(c(1,2,3,2,1, 1,2,3,2,1))
)
Run Code Online (Sandbox Code Playgroud)

以及包含重复项的列名向量,

cols = c('y','x','y','z') # contains a duplicate column name
Run Code Online (Sandbox Code Playgroud)

data.table 正确地阻止我为重复的列名分配值:

dt[,(cols) := lapply(.SD,identity), .SDcols=cols] # Error (OK)
Run Code Online (Sandbox Code Playgroud)

这对我来说似乎是合适的行为,因为它可以帮助避免意外后果。但是,如果我按组做相同的作业,

dt[,(cols) := lapply(.SD,identity), .SDcols=cols, by=group] # No error!
Run Code Online (Sandbox Code Playgroud)

然后data.table不会抛出错误。分配通过,并且可以验证列yz已互换。

这对我来说发生在一个大型应用程序中,同时按组贬低变量,并且很难追踪这种行为的来源。对用户的建议当然是在分配时避免重复列名,并避免向.SDcols. 但是,data.table在这种情况下抛出错误不是更好吗?

JS1*_*204 1

这是一个错误,已在 1.12.4 版本中修复data.table。这是错误报告:https://github.com/Rdatatable/data.table/issues/4874

遇到此问题的其他用户只需更新其软件包版本,例如使用install.packages('data.table'). 要检查当前包版本,请加载data.table然后查看sessionInfo().

但明智的做法是避免向.SDcols.