【问题标题】:data.table switches column namesdata.table 切换列名
【发布时间】:2021-04-18 23:39:11
【问题描述】:

想请问data.table的以下行为是特性还是bug。

鉴于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))
)

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

cols = c('y','x','y','z') # contains a duplicate column name

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

dt[,(cols) := lapply(.SD,identity), .SDcols=cols] # Error (OK)

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

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

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

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

【问题讨论】:

标签: r data.table


【解决方案1】:

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

遇到此问题的其他用户可以简单地更新他们的软件包版本,例如使用install.packages('data.table')。要检查当前包版本,请加载data.table,然后查看sessionInfo() 的输出。

但明智的做法是避免向.SDcols 提供重复的列名。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-14
    • 1970-01-01
    • 2013-05-07
    • 1970-01-01
    • 2021-06-14
    • 2012-07-29
    • 2020-07-08
    • 1970-01-01
    相关资源
    最近更新 更多