Tidyverse中按TRUE/FALSE变量全组合分组计算均值的实现方法
R 实现多布尔变量全组合分组求均值的方案
你可以通过遍历所有非空布尔变量组合的方式完成计算,依赖tidyverse套件即可实现,完整代码如下:
# 加载依赖 library(tidyverse) # 你的示例数据集 set.seed(1) data <- tibble( A = sample(c(TRUE, FALSE), 10, replace = T), B = sample(c(TRUE, FALSE), 10, replace = T), C = sample(c(TRUE, FALSE), 10, replace = T), value = sample(1:100, 10) ) # 核心计算逻辑 ## 定义参与组合的布尔变量列,可根据实际需求调整 bool_cols <- c("A", "B", "C") ## 遍历所有非空组合计算均值,输出tidy格式tibble result <- map_dfr(seq_along(bool_cols), function(group_len) { # 生成长度为group_len的所有变量组合 combn(bool_cols, group_len, simplify = FALSE) %>% map_dfr(function(current_group) { # 过滤出当前组合所有变量都为TRUE的行 filter_data <- data %>% filter(if_all(all_of(current_group), ~.x)) # 返回单组计算结果 tibble( group = paste(current_group, collapse = ","), group_size = nrow(filter_data), value_mean = mean(filter_data$value) ) }) })
运行后得到的result就是符合要求的结果,输出示例如下:
# A tibble: 7 × 3 group group_size value_mean <chr> <int> <dbl> 1 A 5 49 2 B 4 60 3 C 5 65.8 4 A,B 2 54.5 5 A,C 3 67 6 B,C 2 64 7 A,B,C 3 67
和你描述的示例完全匹配:A,B,C组均值为(89+79+33)/3=67,B,C组均值为(44+84)/2=64。如果需要调整参与组合的布尔变量,只需要修改bool_cols的定义即可,不需要改动核心逻辑。
内容的提问来源于stack exchange,提问作者Geo Vogler
相关产品推荐
相关产品推荐

