You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

处理嵌套命名向量时tidyr::unnest_longer的更快替代方案有哪些?

高性能unnest_longer替代方案汇总

以下方案针对嵌套命名向量的列表列展开场景优化,性能远高于tidyr::unnest_longer,适配百万行级业务数据需求。

20万行测试集各方案耗时参考:

  • tidyr::unnest_longer:2.47分钟
  • base R:12秒
  • rrapply:7秒
  • collapse:2.8秒
  • data.table:2.2秒

data.table方案(最优性能,生产环境首选)

纯C实现的底层逻辑,内存占用低,处理速度最快。

library(data.table)
# 第一步:将原数据集转为data.table格式,假设列表列名为list_col
setDT(origin_data)

# 写法1:保留原数据集所有非列表列,直接展开生成value、name列
result_dt <- origin_data[, 
  .(value = unlist(list_col), name = names(unlist(list_col))), 
  by = setdiff(names(origin_data), "list_col")
]

# 写法2:如果只需要保留行索引关联原数据,运行速度更快
result_dt <- origin_data[, {
  vec <- list_col[[1]]
  .(value = vec, name = names(vec))
}, by = .(row_id = seq_len(nrow(origin_data)))]

collapse方案(性能接近data.table,语法简洁)

专门为高性能数据处理设计的R包,unnest2接口直接适配列表列展开需求,学习成本低。

library(collapse)
# 直接展开列表列,自动保留原数据集所有非列表列
result <- unnest2(origin_data, col = list_col, idcol = "name")
# 重命名值列(默认和原列表列同名)
names(result)[names(result) == "list_col"] <- "value"

base R方案(无第三方依赖)

不需要安装额外包,适合受环境限制的场景,性能也远超tidyr方案。

# 假设原数据框为origin_data,列表列名为list_col
element_lengths <- lengths(origin_data$list_col)
# 重复原数据行匹配列表元素数量
result <- origin_data[rep(seq_len(nrow(origin_data)), element_lengths), 
                      setdiff(names(origin_data), "list_col"), 
                      drop = FALSE]
# 新增值和名称列
result$value <- unlist(origin_data$list_col, use.names = FALSE)
result$name <- names(unlist(origin_data$list_col))

rrapply方案(适配复杂嵌套场景)

如果你的列表列存在多层嵌套结构,rrapply可以灵活处理,性能优于base R。

library(rrapply)
# 提取列表列的名称和值
list_melt <- rrapply(origin_data$list_col, how = "melt")
element_lengths <- lengths(origin_data$list_col)
# 合并回原数据集的其他列
result <- cbind(
  origin_data[rep(seq_len(nrow(origin_data)), element_lengths), 
              setdiff(names(origin_data), "list_col"), 
              drop = FALSE],
  list_melt[, c("value", "L1")]
)
names(result)[names(result) == "L1"] <- "name"

注意事项
  • 处理前可先过滤空向量行:origin_data <- origin_data[lengths(origin_data$list_col) > 0, ],避免展开报错
  • 提前删除不需要的字段,可进一步降低内存占用、提升处理速度

内容的提问来源于stack exchange,提问作者Emman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 23:45:01