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

如何在动态演化的DataFrame中按周期汇总Target值生成向量?

按周期汇总Target值生成固定长度向量的简洁实现

在Shiny应用中存在随用户输入动态变化的DataFrame,例如:

series_DF_1:

> series_DF_1
       Series One Series Two Series Three
Period          1          2            3
Target      98000      96000        95000

series_DF_2:

> series_DF_2
       Series One Series Two Series Three Series Four
Period          1          1            3           5
Target      98000      96000        95000         100

需求说明

需要生成一个5元素向量,向量的第n位对应周期n,汇总该周期下所有Series的Target值。例如:

  • series_DF_1的结果为 c(98000, 96000, 95000, 0, 0)
  • series_DF_2的结果为 c(194000, 0, 95000, 0, 100)

求在base R或dplyr中实现该需求的简洁方法,避免使用繁琐的for循环。

数据框创建代码

series_DF_1 <- data.frame(
  "Series One" = c(1,98000),
  "Series Two" = c(2,96000),
  "Series Three" = c(3,95000),
  row.names = c("Period","Target"),
  check.names = FALSE
)

series_DF_2 <- data.frame(
  "Series One" = c(1,98000),
  "Series Two" = c(1,96000),
  "Series Three" = c(3,95000),
  "Series Four" = c(5,100),
  row.names = c("Period","Target"),
  check.names = FALSE
)

实现方案

1. Base R 方法

通过转置数据框、分组求和、匹配补零三步实现:

get_period_sum <- function(df) {
  # 转置并整理数据格式
  df_t <- t(df) |> as.data.frame() |> 
    setNames(c("Period", "Target")) |> 
    transform(Period = as.integer(Period))
  
  # 按周期汇总Target值
  period_sums <- tapply(df_t$Target, df_t$Period, sum)
  
  # 生成1-5周期的结果,缺失周期补0
  result <- unname(sapply(1:5, function(x) period_sums[as.character(x)] %||% 0))
  return(result)
}

# 测试
get_period_sum(series_DF_1)
# [1] 98000 96000 95000     0     0
get_period_sum(series_DF_2)
# [1] 194000      0  95000      0    100

2. dplyr + tidyr 方法

利用tidyverse工具链重塑数据并汇总,逻辑更直观:

library(dplyr)
library(tidyr)

get_period_sum_dplyr <- function(df) {
  df |> 
    t() |> as.data.frame() |> 
    rename(Period = 1, Target = 2) |> 
    mutate(Period = as.integer(Period)) |> 
    group_by(Period) |> 
    summarise(Total = sum(Target)) |> 
    complete(Period = 1:5, fill = list(Total = 0)) |> 
    pull(Total)
}

# 测试
get_period_sum_dplyr(series_DF_1)
# [1] 98000 96000 95000     0     0
get_period_sum_dplyr(series_DF_2)
# [1] 194000      0  95000      0    100

内容的提问来源于stack exchange,提问作者Village.Idyot

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 05:07:33