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

如何用tidyverse优雅实现嵌套tibble中bb变量的迭代计算?

问题与解决方案(Advent of Code 2023 第9天)

问题描述

这是Advent of Code 2023第9天的编码需求:现有一个包含列表列的tibble,列表列中的每个子tibble都包含变量aa,需要生成新变量bb,规则如下:

  • 若当前行下方所有aa值均为0,bb等于当前行的aa值;
  • 其余行的bb等于当前行aa值与下一行bb值之和(即bb = aa + lead(bb))。

可复现的示例数据:

dat <- tibble(
  V1 = sample(LETTERS, 3),
  V2 = rnorm(3, 100, 50),
  V3 = list(
    tibble(var_not_used = sample(LETTERS, 5), aa = c(15, 3, 0, 0 ,0)),
    tibble(var_not_used = sample(LETTERS, 5), aa = c(21, 6, 1, 0, 0)),
    tibble(var_not_used = sample(LETTERS, 5), aa = c(45, 15, 6, 2, 0))
  )
)

预期结果:

  • 第一个子tibble的bb为18, 3, 0, 0, 0;
  • 第二个子tibble的bb为28, 7, 1, 0, 0;
  • 第三个子tibble的bb为68, 23, 8, 2, 0。

优雅解决方案

利用tidyverse工具链直接在嵌套对象上操作,无需unnest,仅生成bb列:

library(tidyverse)

dat <- dat %>%
  mutate(V3 = map(V3, ~ .x %>%
                    mutate(bb = rev(accumulate(rev(aa)[-1], ~ .y + .x, .init = rev(aa)[1])))))

逻辑说明

因为bb的计算规则是从下往上递推(当前行依赖下一行的结果),所以采用以下步骤:

  1. 反转aa序列,将递推方向转为从上到下;
  2. 使用accumulate函数从反转后的第一个元素(原数据最后一行)开始,依次计算累加值,得到反转后的bb序列;
  3. 再次反转序列,得到符合原始顺序的bb列。

整个过程无需生成任何中间变量,一步完成嵌套数据的处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 06:33:33