R语言基于命名列表实现条件汇总的自定义函数开发问题
问题根源
你之前的两个实现版本核心错误是:判断逻辑未关联输入tibble的实际列值,仅对过滤规则的键名和过滤值做了无意义的字符串比较(比如"ID1" == "A"返回恒假),因此没有匹配到任何行,求和结果为0。
可行实现方案
我们可以通过遍历过滤规则构造逐行匹配的逻辑向量,同时支持空规则下的全量汇总:
library(tidyverse) summarise_with_filters <- function(df, filters = list(), sum_col = "to_summarize") { # 构造匹配逻辑 if (length(filters) > 0) { # 遍历每条过滤规则,生成对应列的匹配逻辑,用&合并所有规则 match_vec <- imap(filters, ~ df[[.y]] == .x) %>% reduce(`&`) } else { # 空过滤规则默认匹配所有行 match_vec <- rep(TRUE, nrow(df)) } # 执行汇总 df %>% summarise(total = sum(.data[[sum_col]][match_vec])) }
测试验证
# 示例数据 df <- tibble( to_summarize = c(1, 2, 8, 9), ID1 = c('A', 'A', 'C', 'A'), ID2 = c('X', 'Y', 'Z', 'X') ) # 测试1:双条件过滤,预期返回10 filters_2 <- list(ID1 = 'A', ID2 = 'X') df %>% summarise_with_filters(filters_2) # 测试2:单条件过滤,预期返回12 filters_1 <- list(ID1 = 'A') df %>% summarise_with_filters(filters_1) # 测试3:空规则全量汇总,预期返回20 df %>% summarise_with_filters(list())
内容的提问来源于stack exchange,提问作者Jesse Kerr
相关产品推荐
相关产品推荐

