如何在R中高效将data.table转换为二维列表?
高效将data.table转换为二维列表的方法
针对大体积data.table的转换需求,推荐使用data.table原生的高效函数,避免apply这类慢循环方法,以下分两种常见场景给出实现:
场景1:按列拆分的二维列表(适配fcoalesce列间合并场景)
如果你的需求是将data.table的每一列作为子列表元素(这也是fcoalesce最常用的输入形式,比如从a、b、c列取非缺失值填充x列),直接用as.list()即可——这是效率最高的方式,因为data.table本身是列存储结构,该操作不会复制数据,只是生成列的引用:
library(data.table) dt <- data.table(a = c(1, NA, 3), b = c(NA, 2, NA), c = c(5, 6, 7)) # 按列拆分的二维列表 col_list <- as.list(dt) # 直接用于fcoalesce:do.call(fcoalesce, col_list)
场景2:按行拆分的二维列表
如果需要将data.table的每一行作为子列表元素,使用data.table的transpose()函数(C语言实现,远快于base R的t()或循环),再转成列表:
# 按行拆分的二维列表 row_list <- as.list(data.table::transpose(dt))
额外优化:直接在data.table中完成fcoalesce操作
如果你的最终目的是在另一个data.table中填充缺失值,其实不需要提前转换列表,可直接在data.table语法内完成,效率更高:
# 示例:在another_dt中,从a、b、c列取第一个非缺失值填充x列 another_dt[, x := do.call(fcoalesce, .SD), .SDcols = c("a", "b", "c")]
内容的提问来源于stack exchange,提问作者Ian Wang
相关产品推荐
相关产品推荐

