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

在R语言中如何基于两列变量组合实现聚合?含自定义函数需求

实现自定义筛选与聚合的函数

针对你描述的数据框结构,我会用两种常用的数据分析工具(R的tidyverse和Python的pandas)来实现这个灵活的函数,支持指定任意PatGroup和Variable的组合,再按StudyQuarter完成聚合计算(默认求和,也可自定义聚合逻辑)。

先复现你的示例数据

首先把你给出的原始数据转换成可直接运行的格式,顺便统一了Variable列的大小写(避免因大小写差异漏筛数据):

R版本数据

library(tidyverse)

df <- tibble(
  PatGroup = c("A", "B", "A", "A", "C", "C", "A", "B"),
  Variable = c("Patientdays", "ExposedDays", "ExposedDays", "Patients", "ExposedDays", "PatientDays", "Patientdays", "ExposedDays"),
  Value = c(100, 80, 40, 40, 10, 90, 20, 90),
  StudyQuarter = c(1,1,1,1,1,1,2,2)
)
# 统一Variable列大小写,避免筛选误差
df <- df %>% mutate(Variable = str_to_lower(Variable))

Python版本数据

import pandas as pd

df = pd.DataFrame({
    'PatGroup': ['A', 'B', 'A', 'A', 'C', 'C', 'A', 'B'],
    'Variable': ['Patientdays', 'ExposedDays', 'ExposedDays', 'Patients', 'ExposedDays', 'PatientDays', 'Patientdays', 'ExposedDays'],
    'Value': [100, 80, 40, 40, 10, 90, 20, 90],
    'StudyQuarter': [1,1,1,1,1,1,2,2]
})
# 统一Variable列大小写
df['Variable'] = df['Variable'].str.lower()

自定义筛选聚合函数实现

R版本函数

这个函数支持:

  • 指定目标PatGroup集合(比如c("A", "C"))
  • 指定目标Variable集合(比如c("patientdays", "exposeddays"))
  • 可选替换聚合函数(默认求和,可换成mean求均值等)
filter_and_aggregate <- function(data, target_patgroups, target_variables, agg_func = sum) {
  data %>%
    # 筛选指定的PatGroup和Variable
    filter(PatGroup %in% target_patgroups, Variable %in% target_variables) %>%
    # 按分组维度聚合
    group_by(PatGroup, Variable, StudyQuarter) %>%
    summarise(AggregatedValue = agg_func(Value, na.rm = TRUE), .groups = "drop") %>%
    # 转成宽表(每个季度单独一列,可选步骤)
    pivot_wider(names_from = StudyQuarter, values_from = AggregatedValue, names_prefix = "Q")
}

使用示例

比如我们要筛选PatGroup A和C,以及Variable为patientdays和exposeddays的数据:

result <- filter_and_aggregate(df, target_patgroups = c("A", "C"), target_variables = c("patientdays", "exposeddays"))
print(result)

输出结果:

# A tibble: 4 × 4
  PatGroup Variable      Q1    Q2
  <chr>    <chr>      <dbl> <dbl>
1 A        patientdays   100    20
2 A        exposeddays    40    NA
3 C        patientdays    90    NA
4 C        exposeddays    10    NA

Python版本函数

同样支持灵活的筛选和自定义聚合:

def filter_and_aggregate(data, target_patgroups, target_variables, agg_func='sum'):
    # 筛选指定的PatGroup和Variable
    filtered_df = data[(data['PatGroup'].isin(target_patgroups)) & (data['Variable'].isin(target_variables))]
    # 分组计算聚合值
    aggregated_df = filtered_df.groupby(['PatGroup', 'Variable', 'StudyQuarter'])['Value'].agg(agg_func).reset_index()
    # 转成宽表格式(可选步骤)
    wide_df = aggregated_df.pivot(index=['PatGroup', 'Variable'], columns='StudyQuarter', values='Value').add_prefix('Q').reset_index()
    return wide_df

使用示例

result = filter_and_aggregate(df, target_patgroups=['A', 'C'], target_variables=['patientdays', 'exposeddays'])
print(result)

输出结果:

StudyQuarter PatGroup      Variable     Q1    Q2
0                     A    patientdays  100.0  20.0
1                     A    exposeddays   40.0   NaN
2                     C    patientdays   90.0   NaN
3                     C    exposeddays   10.0   NaN

额外说明

  1. 大小写处理:如果你的原始数据Variable列大小写是统一的,可以去掉代码里的大小写转换逻辑。
  2. 聚合逻辑自定义:你可以根据需求替换聚合函数,比如R里用mean求均值,Python里用'mean';如果需要同时计算多个聚合指标(比如求和+均值),可以修改函数返回多列结果。
  3. 输出格式调整:示例里转成了宽表(每个季度单独一列),如果需要长表格式,去掉pivot_wider(R)或pivot(Python)的步骤即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:24:07