R中频率统计与组合分析结果不一致的修正代码咨询
问题描述
使用R语言生成包含PTSD、ANX、DEP变量的数据集后,通过table()函数得到各变量High(值为2)的计数:PTSD=167、ANX=156、DEP=156。但原组合分析代码输出的单一变量High计数与该结果不符,经Excel的COUNTIFS函数验证,正确的组合计数应为:
- PTSD: 167
- ANX: 156
- DEP: 156
- PTSD+ANX: 56
- PTSD+DEP: 52
- ANX+DEP: 51
- PTSD+ANX+DEP: 23
原代码问题分析
原组合分析代码通过长格式转换、筛选High值后按ID汇总变量组合,统计的是**仅该组合变量为High,其余变量为非High(Low或NA)的人数,而非用户需要的该组合变量均为High,其余变量任意(包括High/NA/Low)**的人数,因此结果与预期不符。
修正后的组合分析代码
方法一:手动定义组合(适合变量较少的场景)
library(dplyr) # 定义需要统计的所有组合及对应筛选条件 combinations <- list( "PTSD" = ~PTSD == 2, "ANX" = ~ANX == 2, "DEP" = ~DEP == 2, "PTSD+ANX" = ~PTSD == 2 & ANX == 2, "PTSD+DEP" = ~PTSD == 2 & DEP == 2, "ANX+DEP" = ~ANX == 2 & DEP == 2, "PTSD+ANX+DEP" = ~PTSD == 2 & ANX == 2 & DEP == 2 ) # 遍历组合计算计数 result <- purrr::imap_dfr(combinations, function(filter_rule, combo_name) { df %>% filter(!!filter_rule) %>% summarise(combination = combo_name, n = n()) }) print(result)
方法二:动态生成组合(适合变量较多的场景)
library(dplyr) library(purrr) library(tidyr) # 指定目标变量 target_vars <- c("PTSD", "ANX", "DEP") # 生成所有非空变量子集 all_subsets <- map(seq_along(target_vars), function(k) { combn(target_vars, k, simplify = FALSE) }) %>% flatten() # 转换子集为组合名称和筛选表达式 subset_details <- map_dfr(all_subsets, function(subset) { combo_name <- paste(subset, collapse = "+") # 构建多变量同时为High的筛选规则 filter_expr <- map(subset, ~sym(.x) == 2) %>% reduce(`&`) tibble(combination = combo_name, filter = list(filter_expr)) }) # 计算每个组合的符合条件的行数 result <- subset_details %>% rowwise() %>% mutate(n = nrow(filter(df, !!filter))) %>% ungroup() %>% select(combination, n) print(result)
验证结果
运行修正后的代码,输出将与Excel验证结果完全一致:
# A tibble: 7 × 2 combination n <chr> <int> 1 PTSD 167 2 ANX 156 3 DEP 156 4 PTSD+ANX 56 5 PTSD+DEP 52 6 ANX+DEP 51 7 PTSD+ANX+DEP 23
内容的提问来源于stack exchange,提问作者pdeli
相关产品推荐
相关产品推荐

