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

能否直接将长度一致的列表列拆分为n列?

嘿,这个问题问得特别好!既然你已经试过tidyr::separate(知道它只处理字符向量)和unnest+spread的组合,那我给你分享几个更直接的方法——毕竟所有列表元素长度一致的话,完全不用绕弯路:

最推荐:用tidyr::unnest_wider一步到位

这绝对是最简便的方案,tidyr的unnest_wider就是专门为「把长度一致的列表列拆成多列」设计的,完全不需要辅助变量:

library(tidyr)
library(tibble)

# 你的示例数据
df1 <- tibble(
  gr = c('a', 'b', 'c'),
  values = list(1:2, 3:4, 5:6)
)

# 核心代码
df1 %>% unnest_wider(values, names_sep = "_")

执行后直接得到你想要的结果:

# A tibble: 3 × 3
  gr    val_1 val_2
  <chr> <int> <int>
1 a         1     2
2 b         3     4
3 c         5     6

names_sep参数用来控制新列名的分隔符,默认是.,改成_更符合常规命名习惯,你也可以自定义其他字符。

灵活方案:purrr::map_dfc + dplyr::mutate

如果你更习惯用purrr的函数,这个组合也很灵活,能自定义列名规则:

library(dplyr)
library(purrr)

df1 %>%
  mutate(map_dfc(values, ~ set_names(., paste0("val_", seq_along(.))))) %>%
  select(-values)

解释:map_dfc会把每个列表元素转换成一个小数据框,然后按列合并到原数据中;set_names用来给新列批量命名,最后删掉原有的values列即可。

原生R方案(无需加载包)

如果不想依赖tidyverse,用基础R也能快速搞定:

# 把列表转成矩阵,再和原数据合并
result <- cbind(df1[-2], do.call(rbind, df1$values))
# 给新列命名
colnames(result)[-1] <- paste0("val_", 1:(ncol(result)-1))

解释:do.call(rbind, df1$values)把长度一致的列表直接转换成矩阵,cbind用来和原数据去掉values的部分合并,最后给新列加上自定义名称。

总的来说,tidyr::unnest_wider是最省心的选择,代码简洁、可读性强,完美匹配你的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:26:36