tidyr::unnest_wider替代方案求助:嵌套列表含非向量对象时失效
解决方案:嵌套列表含非向量对象的展开问题
针对tidyr::unnest_wider无法处理包含非向量对象(如lm模型、ggplot对象、mcpfit对象)的嵌套列表问题,以下是几种可行的替代方案:
一、Tidyverse 适配方案
1. 先过滤非向量元素再展开
如果不需要保留非向量对象,可以先遍历嵌套列表,仅保留向量类型元素,再使用unnest_wider:
library(tidyverse) m <- tibble::as_tibble(mtcars[1,]) %>% mutate(ls_col=list( list( a=c(1:10), b=lm(cyl~gear)) ) ) # 过滤嵌套列表中的非向量元素 m_clean <- m %>% mutate(ls_col = map(ls_col, ~ keep(.x, is.vector))) # 正常展开为单独列 m2 <- m_clean %>% unnest_wider(ls_col)
2. 保留非向量对象的展开方式
若需要保留非向量对象,可将其包装为列表列后再展开,避免报错:
m_keep <- m %>% mutate(ls_col = map(ls_col, ~ map(.x, function(x) { # 非向量对象包装为列表,向量直接保留 if (!is.vector(x)) list(x) else x }))) %>% unnest_wider(ls_col) # 访问保留的非向量对象(如lm模型) m_keep$b[[1]]
二、data.table 替代方案
使用data.table的rbindlist提取嵌套列表元素,再与原表合并:
library(data.table) dt <- as.data.table(mtcars[1,]) dt[, ls_col := list(list(list(a = 1:10, b = lm(cyl~gear))))] # 展开嵌套列表为data.table ls_dt <- rbindlist(dt$ls_col, fill = TRUE) # 合并原表与展开后的结果 result_dt <- cbind(dt[, !"ls_col"], ls_dt)
三、Base R 解决方案
通过手动提取嵌套列表元素,结合cbind完成合并:
df <- as.data.frame(mtcars[1,]) df$ls_col <- list(list(a = 1:10, b = lm(cyl~gear))) # 提取嵌套列表中的元素,将非向量对象保留为列表列 ls_elements <- df$ls_col[[1]] ls_df <- data.frame( a = I(list(ls_elements$a)), b = I(list(ls_elements$b)) ) # 合并原表与处理后的嵌套元素表 result_base <- cbind(df[, !"ls_col"], ls_df)
内容的提问来源于stack exchange,提问作者D Kincaid
相关产品推荐
相关产品推荐

