如果c
和0,则列x
和给定值1
的虚拟列等于c==x
。通常,通过为列c
创建虚拟对象,可以在选择时排除一个值x
,因为最后一个虚拟列不会添加任何信息w.r.t.现有的虚拟列。
以下是我在firm
中为data.table
列创建一长串虚拟对象的方法:
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
的相关内容。
答案 0 :(得分:3)
以Arun的评论作为答案
您应该使用alloc.col
函数将data.table中所需的列数预先分配给大于预期ncol的数字。
alloc.col(myDataTable, 3200)
另外,根据您使用数据的方式,我建议您考虑将宽表重新整理为长表,请参阅EAV。然后,每个数据类型只需要一列。