如何在动态演化的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
相关产品推荐
相关产品推荐

