如何对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
相关产品推荐
相关产品推荐

