如何用dplyr规范实现嵌套数据框的部分展开(仅提取一列到顶层)?
问题解答
你的需求本质是把嵌套列中的指定字段(比如gear)提取到顶层作为新分组键,同时保留该分组下的剩余数据为嵌套结构——也就是只展开目标字段,而非完全展开所有行。目前dplyr没有专门的单一函数直接实现,但可以用更贴合意图的组合写法,比你当前的绕弯方法更直观:
方法1:purrr::map + tidyr::nest_by + tidyr::unnest
这个逻辑清晰体现“先在嵌套内按目标字段重分组,再展开到顶层”的意图:
library(tidyr) library(dplyr) library(purrr) m <- mtcars %>% nest_by(cyl) # 部分展开gear到顶层,剩余数据保持嵌套 m %>% mutate(data = map(data, ~ .x %>% nest_by(gear))) %>% # 每个cyl对应的嵌套数据按gear重新嵌套 unnest(data) # 把新的嵌套结构展开到顶层
方法2:dplyr::rowwise + dplyr::reframe
reframe本身就是为分组数据生成多行结果设计的,写法更简洁直接:
m %>% rowwise(cyl) %>% reframe(data %>% nest_by(gear))
关于你尝试的hoist无效的原因
你用hoist(data, "cyl")是提取已经存在于顶层的cyl列,自然只会得到重复的列表列。如果要提取gear,应该写hoist(data, gear = "gear"),但这会得到gear的列表列,还需要配合unnest_longer展开,再重新嵌套剩余数据,步骤反而更多,不如上面的方法高效。
如果从原始数据出发,其实可以一步到位实现最终效果:
mtcars %>% nest_by(cyl, gear)
内容的提问来源于stack exchange,提问作者akraf
相关产品推荐
相关产品推荐

