【问题标题】:R: Warning when creating a (long) list of dummiesR:创建(长)假人列表时发出警告
【发布时间】:2015-04-13 21:11:33
【问题描述】:

如果c==x 和0 否则,列c 和给定值x 的虚拟列等于1。通常,通过为c 列创建虚拟对象,可以选择排除一个值x,因为最后一个虚拟列不会添加任何信息w.r.t。已经存在的虚拟列。

这是我尝试在data.table 中为firm 列创建一长串假人的方法:

values <- unique(myDataTable$firm)
cols <- paste('d',as.character(inds[-1]), sep='_') # gives us nice d_value names for columns
# the [-1]: I arbitrarily do not create a dummy for the first unique value
myDataTable[, (cols):=lapply(values[-1],function(x)firm==x)]

此代码可靠地适用于具有较小唯一值的先前列。 firm 但是更大:

tr(values)
 num [1:3082] 51560090 51570615 51603870 51604677 51606085 ...

我在尝试添加列时收到警告:

Warning message:
  truelength (6198) is greater than 1000 items over-allocated (length = 36). See ?truelength. If you didn't set the datatable.alloccol option very large, please report this to datatable-help including the result of sessionInfo().

据我所知,我仍然需要所有列。我可以忽略这个问题吗?它会减慢未来的计算速度吗?我不确定如何理解这个和truelength 的相关性。

【问题讨论】:

  • 提供数据,只是一个样本,使用dput(myDataTable[1:10])编辑: 看起来与要添加的列的大小有关,因此示例数据可能不容易共享。您是否尝试将提到的选项设置为length(values)
  • 6000+ 列?!? :-O。阅读?truelength 并使用alloc.coln 参数将备用槽增加到您正在创建的列数。否则您将收到警告,因为每次使用备用槽时我们都必须过度分配起来..
  • @Arun ncol(myDataTable) 给了我[1] 3085,因此该消息实际上没有意义。我是否正确理解每次我添加大量未预先分配的列时效率低下?既然如此,既然这是一个独特的操作,我想我很好。
  • truelength = no: of cols + 空闲槽。当你通常创建一个data.table 时,比如说,有 2 个列(真实长度默认为 100),有 98 个空闲槽。如果你现在添加 99 个列,我们必须在第 99 次进行浅拷贝(没有空闲slot) 并过度分配给 >101 cols,将结果分配回去.. 它可以忽略不计,但如果执行太多次,可能会变得很明显。
  • 在您的情况下,使用alloc.col 为这个data.table 过度分配给大量(例如:3200,因为您说3000+ cols)。那么一切都会好起来的。

标签: r data.table


【解决方案1】:

将 Arun 的评论作为答案。
您应该使用alloc.col 函数将 data.table 中所需的列数预先分配给大于预期 ncol 的数字。

alloc.col(myDataTable, 3200)

此外,根据您使用数据的方式,我建议您考虑将宽表重塑为长表,请参阅EAV。然后,您需要每种数据类型只有一列。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-22
    • 1970-01-01
    • 1970-01-01
    • 2019-08-16
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 2021-05-03
    相关资源
    最近更新 更多