如何在含多列表列的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 3Species 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 6Species 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

