如何在R中创建递归嵌套的tibble?求更优雅实现方案
优雅实现递归嵌套 tibble 的几种思路
针对你想要创建的每行x嵌套对应后续n行y的嵌套tibble需求,这里提供几种比uncount更简洁的实现思路,全部基于tidyverse工具链:
方法1:用purrr::map实现向量式嵌套
这是最简洁的方式,利用map对每个x值生成对应的子tibble:
library(tibble) library(dplyr) library(purrr) # 原始数据 df <- tibble(x = 5:1, y = 5:1) # 生成嵌套tibble nested_df <- df %>% mutate(data = map(x, ~ df %>% filter(x <= .x) %>% select(y))) %>% select(x, data)
效果说明:
- 当
x=5时,data列包含所有5行的y值(5,4,3,2,1) - 当
x=4时,data列包含x<=4对应的4行y值(4,3,2,1) - 以此类推,完全符合“每行x嵌套后续n行y”的需求
方法2:用rowwise实现行级嵌套
如果你更习惯行级操作的思路,rowwise+slice的组合更直观:
library(tibble) library(dplyr) df <- tibble(x = 5:1, y = 5:1) nested_df <- df %>% rowwise() %>% # 取当前x对应的行到最后一行的y值 mutate(data = list(slice(df, which(x == cur_data()$x):n()) %>% select(y))) %>% ungroup() %>% select(x, data)
优势对比:
map方法属于向量式操作,代码更凝练,处理大数据时效率更高rowwise方法逻辑更直白,适合刚接触tidyverse的用户理解行级处理逻辑
和你原方法的对比
你基于uncount的思路需要先扩展行、再分组计算,步骤较多且中间生成了冗余数据。上面的两种方法都直接从原始数据一步生成嵌套结构,代码更简洁,可读性也更强。
内容的提问来源于stack exchange,提问作者Mutuelinvestor
相关产品推荐
相关产品推荐

