如何在R中便捷操作多级嵌套数据框的指定层级?
多级嵌套数据框的层级操作方案
先看你给出的示例数据,最终的嵌套结构是:
- 顶层
df:包含id列和第一层级嵌套列sub_df sub_df里的每个子数据框:包含sub_id列和第二层级嵌套列sub_sub_dfsub_sub_df里的每个子数据框:包含sub_sub_id列和第三层级嵌套列sub_sub_sub_df
要对第三层级的sub_sub_df执行mutate计算,完全不用写多层嵌套的purrr::map,下面是几种清晰简便的实现方式:
方法一:用purrr::map_depth直接指定层级操作
map_depth可以精准定位到指定嵌套层级,避免嵌套map的混乱。比如要在第三层级的每个数据框里新增一列count,统计sub_sub_sub_df的行数:
library(purrr) library(dplyr) df_modified <- df %>% mutate(sub_df = map_depth(sub_df, depth = 2, ~ .x %>% mutate(sub_sub_df = map(sub_sub_df, ~ .x %>% mutate(count = nrow(sub_sub_sub_df))))))
这里的depth=2是从sub_df开始计数:sub_df本身是第一层嵌套,它里面的sub_sub_df是第二层,所以用map_depth(sub_df, 2, ...)就能定位到你要操作的第三层级数据框。
方法二:拆包操作后再嵌套回去
如果层级不算多,直接把目标层级拆出来操作,再重新嵌套,可读性拉满:
library(tidyr) library(dplyr) df_modified <- df %>% # 拆到第二层级,把sub_sub_df露出来 unnest(sub_df) %>% # 对每个sub_sub_df执行mutate mutate(sub_sub_df = map(sub_sub_df, ~ .x %>% mutate(count = nrow(sub_sub_sub_df)))) %>% # 重新嵌套回原来的结构 nest(sub_df = c(sub_id, sub_sub_df))
方法三:用modify_at配合列名路径操作
想直观指定嵌套路径的话,用modify_at逐层定位嵌套列也很方便:
library(dplyr) library(purrr) df_modified <- df %>% modify_at("sub_df", ~ .x %>% modify_at("sub_sub_df", ~ .x %>% mutate(count = nrow(sub_sub_sub_df))))
这几种方法都比多层嵌套map清晰很多:map_depth适合层级多且固定的场景,拆包嵌套的方式最直观,modify_at则适合需要明确指定列路径的情况。
内容的提问来源于stack exchange,提问作者Saren Tasciyan
相关产品推荐
相关产品推荐

