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

如何在含多列表列的tibble中仅展开指定列表列

如何在保留其他嵌套列的同时仅展开指定列表列?

你现在有一个包含多个列表列的tibble,想要只展开其中一个列表列(比如示例里的sum_data),同时保留另一个嵌套列(data),而且不想手动指定要展开的列里的每一个字段名,也不想先把整个数据集展开再重新嵌套data列。

先看你的原始代码:

library(dplyr)
library(purrr)
library(tidyr)
library(stringr)

iris %>% 
  group_by(Species) %>% 
  nest() %>% 
  mutate(sum_data = map(data, ~.x %>% summarize_all(mean) %>% rename_all(funs(str_c("Mean.", .)))))

这段代码输出的是一个3行3列的tibble,其中data和sum_data都是列表列:

A tibble: 3 x 3

Species data sum_data

1 setosa <tibble [50 x 4]> <tibble [1 x 4]>
2 versicolor <tibble [50 x 4]> <tibble [1 x 4]>
3 virginica <tibble [50 x 4]> <tibble [1 x 4]>

解决方案

你可以使用tidyr包中的unnest_wider()函数,它可以针对单个列表列进行展开,同时自动保留其他所有列(包括嵌套的data列),而且不需要手动指定要展开的列里的字段名:

iris %>% 
  group_by(Species) %>% 
  nest() %>% 
  mutate(sum_data = map(data, ~.x %>% summarize_all(mean) %>% rename_all(funs(str_c("Mean.", .))))) %>%
  unnest_wider(sum_data)

运行这段代码后,就能得到你想要的结果:

A tibble: 3 x 6

Species data Mean.Sepal.Length Mean.Sepal.Width Mean.Petal.Length Mean.Petal.Width

1 setosa <tibble [50 x 4]> 5.006 3.428 1.462 0.246
2 versicolor <tibble [50 x 4]> 5.936 2.770 4.260 1.326
3 virginica <tibble [50 x 4]> 6.588 2.974 5.552 2.026

补充说明

unnest_wider()会把目标列表列里的每一列都展开成单独的列,而且会自动处理列名,完全符合你的需求——不需要指定列名,也不会影响其他嵌套列的结构。如果你的sum_data里有更多列,这个方法也同样适用,不需要修改代码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:41:46