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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 04:01:21