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

如何对tibble列执行unnest操作以得到指定行数的结果?

实现tibble嵌套列表的自定义展开(生成指定行数)

问题描述

需要将给定的tibble通过unnest操作展开为16行,具体要求:

  • 第1行展开为4行
  • 第2行展开为2行
  • 第3行展开为10行(由长度为5的a_X_values和长度为2的b_X_values做笛卡尔积得到)

原始数据与默认方法的问题

原始数据定义:

library(tidyverse)

tbl <- tibble(
  a_X_values = list(NA, c(3, NA), c(4, 5, 6, NaN, NaN)),
  a_Y_values = list(c(NaN, NaN, 3, 5), NaN, NaN),
  b_X_values = list(7, 8, c(3, NaN)),
  b_Y_values = c(NA, NaN, 1)
)

直接使用unnest(where(is.list))会因为第三行中a_X_values(长度5)和b_X_values(长度2)的列表长度不匹配而报错,且无法生成笛卡尔积的展开效果。

解决方案

通过按行处理,对每行的嵌套列表生成笛卡尔积,再合并结果:

tbl_result <- tbl %>%
  rowwise() %>%
  mutate(
    expanded = list(
      crossing(
        # 对列表列直接取值,非列表列转为单元素列表以参与crossing
        a_X_values = if (is.list(a_X_values)) a_X_values else list(a_X_values),
        a_Y_values = if (is.list(a_Y_values)) a_Y_values else list(a_Y_values),
        b_X_values = if (is.list(b_X_values)) b_X_values else list(b_X_values)
      ) %>%
        # 非列表列b_Y_values直接重复对应次数
        mutate(b_Y_values = !!b_Y_values)
    )
  ) %>%
  unnest(expanded) %>%
  ungroup()

期望输出验证

期望的目标tibble定义:

tbl_desired <- tibble(
  a_X_values = c(NA, NA, NA, NA, 3, NA, 4, 5, 6, NaN, NaN, 4, 5, 6, NaN, NaN ),
  a_Y_values = c(NaN, NaN, 3, 5, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN),
  b_X_values = c(7, 7, 7, 7, 8, 8, 3, NaN, 3, NaN, 3, NaN, 3, NaN, 3, NaN),
  b_Y_values = c(NA, NA, NA, NA, NaN, NaN, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
)

执行all.equal(tbl_result, tbl_desired)可验证结果与期望一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 21:45:36