如何阻止data.table将不同长度向量的列表强制转换为data.table?
从data.table生成不规则命名列表的最优方案
核心问题
data.table默认会自动将列表转换为矩形结构:若列表包含单元素向量,会重复该元素以匹配其他向量的长度,最终输出data.table。但实际需求是从示例data.table foo中生成非data.table类型的命名不规则列表,常规的列表嵌套写法均会被强制转换为data.table,无法得到目标结构。
三种存储形式的对比
针对以下三种存储方式做了内存与访问效率测试:
- 不规则列表:内存占用最低,无需重复存储单元素数据;元素直接访问速度最快。
- 含嵌套列的data.table:内存开销介于两者之间;访问元素需额外索引层级,效率略低于不规则列表。
- 矩形data.table:内存占用最高,因大量重复单元素数据;元素访问需从重复列中取值,效率最低。
最优创建方法
测试多种创建逻辑后,with构造是生成不规则命名列表的最优选择:
# 基于示例data.table foo的实现 output_list <- with(foo, list( single_val = colA[1], # 提取单元素 full_col = colB, # 提取整列多元素 partial_col = colC[2:6] # 提取列中部分元素 ))
该写法可直接从data.table中提取不同长度的元素,不会被强制转换为data.table,且创建速度远优于其他嵌套或手动构造的方法。
内容的提问来源于stack exchange,提问作者Danielle McCool
相关产品推荐
相关产品推荐

