R语言data.table函数内创建删除过多列失效问题求助
问题原因与解决方案
问题根源
这是data.table 1.13.0版本的已知bug:当data.table的列数超过1024时,内部存储结构会发生切换,而函数环境下的循环逐列删除操作(:= NULL)无法正确同步修改外部的data.table对象。具体表现为:
- 当创建1023列时,总列数(含原列
a)为1024,未触发存储结构切换,删除操作正常生效; - 当创建1025列时,总列数达到1026,触发了内部存储结构切换,此时循环中逐列执行的
:= NULL无法正确修改外部的data.table实例,导致删除操作完全失效。
解决方案
1. 升级data.table版本
该bug在data.table 1.14.0及后续版本中已被修复,直接升级到最新稳定版即可彻底解决问题:
install.packages("data.table")
2. 临时替代方案(不升级版本时)
避免循环逐列删除,改用批量删除的方式一次性指定所有待删除列名,绕过结构切换后的环境引用问题:
修改函数g的删除逻辑如下:
g <- function(d,n=200){ # 创建n列 for (ii in 1:n){ cname = paste0('x',ii) d[,c(cname):= ii] } # 批量删除n-5列 cols_to_remove <- paste0('x', 1:(n-5)) d[, (cols_to_remove) := NULL] }
批量操作会直接修改data.table的列集合,不受存储结构切换的影响,无论n取值多大都能正常执行删除。
内容的提问来源于stack exchange,提问作者user3226167
相关产品推荐
相关产品推荐

