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

如何在data frame的嵌套tibble列中应用mutate存储计算结果

实现tibble嵌套列的逐年增长值自动化计算

示例数据集构造

先创建包含必要字段的示例tibble,模拟你的原始数据:

library(tibble)
library(dplyr)
library(purrr)

# 示例数据:id为行标识,T为每行需要计算的年份数
df <- tibble(
  id = 1:3,
  generalPotentialRev = c(100, 200, 300),
  growthRateInc = c(0.05, 0.03, 0.07),
  T = c(3, 4, 2)
)

自动化生成嵌套列的代码

使用pmap逐行处理,根据每行的T值动态生成对应年份的增长值,并封装为嵌套tibble:

df_nested <- df %>%
  mutate(
    projected_rev = pmap(
      list(generalPotentialRev, growthRateInc, T),
      function(base, rate, years) {
        # 计算逐年增长值
        annual_values <- base * (1 + rate)^(1:years)
        # 动态设置列名并转为tibble
        tibble(!!!set_names(annual_values, paste0("Year ", 1:years)))
      }
    )
  )

代码解释

  • pmap:按行传递generalPotentialRev、growthRateInc、T三个参数,实现逐行自定义计算
  • annual_values:根据公式generalPotentialRev*(1+growthRateInc)^(1:T)计算每个年份的增长值
  • set_names + !!!:动态生成Year 1、Year 2...格式的列名,将命名向量转为tibble的列结构

查看结果

打印处理后的数据集:

print(df_nested, width = Inf)

输出示例:

# A tibble: 3 × 5
     id generalPotentialRev growthRateInc     T projected_rev  
  <int>               <dbl>         <dbl> <dbl> <list>         
1     1                 100          0.05     3 <tibble [1 × 3]>
2     2                 200          0.03     4 <tibble [1 × 4]>
3     3                 300          0.07     2 <tibble [1 × 2]>

查看某一行的嵌套列内容:

df_nested$projected_rev[[1]]

输出示例:

# A tibble: 1 × 3
  `Year 1` `Year 2` `Year 3`
     <dbl>    <dbl>    <dbl>
1     105     110.25   115.7625

固定年份数的简化写法

如果所有行的计算年份数T是固定值(比如统一计算3年),可直接用tibble构造嵌套列,无需pmap:

fixed_years <- 3
df_nested_fixed <- df %>%
  mutate(
    projected_rev = tibble(
      `Year 1` = generalPotentialRev * (1 + growthRateInc)^1,
      `Year 2` = generalPotentialRev * (1 + growthRateInc)^2,
      `Year 3` = generalPotentialRev * (1 + growthRateInc)^3
    )
  )

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 15:33:26