在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
额外说明
- 大小写处理:如果你的原始数据
Variable列大小写是统一的,可以去掉代码里的大小写转换逻辑。 - 聚合逻辑自定义:你可以根据需求替换聚合函数,比如R里用
mean求均值,Python里用'mean';如果需要同时计算多个聚合指标(比如求和+均值),可以修改函数返回多列结果。 - 输出格式调整:示例里转成了宽表(每个季度单独一列),如果需要长表格式,去掉
pivot_wider(R)或pivot(Python)的步骤即可。
内容的提问来源于stack exchange,提问作者HM8689
相关产品推荐
相关产品推荐

