【发布时间】: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.col和n参数将备用槽增加到您正在创建的列数。否则您将收到警告,因为每次使用备用槽时我们都必须过度分配起来.. -
@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