列的虚拟列c和给定值x等于1if c==x和0 else.通常,通过为列创建虚拟对象c,可以x在选择时排除一个值,因为最后一个虚拟列不会添加任何已存在的虚拟列的信息.
这是我如何尝试为列创建一个很长的虚拟列表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)]
Run Code Online (Sandbox Code Playgroud)
此代码可靠地用于以前的列,这些列具有较小的唯一值.firm但是更大:
tr(values)
num [1:3082] 51560090 51570615 51603870 51604677 51606085 ...
Run Code Online (Sandbox Code Playgroud)
我在尝试添加列时收到警告:
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().
Run Code Online (Sandbox Code Playgroud)
据我所知,仍然有我需要的所有列.我可以忽略这个问题吗?它会减慢未来的计算速度吗?我不知道该怎么做以及相关的truelength.
以阿伦的评论作为答案。
您应该使用alloc.col函数将 data.table 中所需的列数预先分配为大于预期 ncol 的数字。
alloc.col(myDataTable, 3200)
Run Code Online (Sandbox Code Playgroud)
此外,根据您使用数据的方式,我建议考虑将宽表重塑为长表,请参阅EAV。那么每种数据类型只需要一列。