如何在统计TRUE数量时用0替代NULL生成向量?
解决按类别统计TRUE比例的问题(含全FALSE场景)
明确需求
针对Var1的每个类别(A、B、C),计算该类别中目标变量(如Var2/Var3)为TRUE的比例(即平均值,因为TRUE等价于1,FALSE等价于0),生成对应每个Var1类别的向量;当目标变量全为FALSE时,每个类别对应的比例返回0,而非NULL。
方法1:使用dplyr(简洁稳定)
library(dplyr) # 定义函数:按Var1分组计算目标变量的TRUE比例 get_true_proportion <- function(data, target_col) { data %>% group_by(Var1) %>% summarize(proportion = mean({{target_col}}, na.rm = TRUE)) %>% tibble::deframe() # 转换为命名向量,名称对应Var1的类别 } # 计算Var2的结果 count1 <- get_true_proportion(df, Var2) # 输出结果:A=1, B=0, C=1 # 计算Var3的结果 count2 <- get_true_proportion(df, Var3) # 输出结果:A=0, B=0, C=0
方法2:基础R实现(无第三方依赖)
用aggregate函数即可完成需求:
# 计算Var2的TRUE比例 count1_result <- aggregate(Var2 ~ Var1, data = df, FUN = mean) count1_vec <- setNames(count1_result$Var2, count1_result$Var1) # 计算Var3的TRUE比例 count2_result <- aggregate(Var3 ~ Var1, data = df, FUN = mean) count2_vec <- setNames(count2_result$Var3, count2_result$Var1)
原代码问题说明
你原代码中count2 = as.vector(tapply(df$Var1, df$Var3, table)$'TRUE')/nrow(df)出现NULL的原因:
- 逻辑偏差:
tapply(df$Var1, df$Var3, table)是按Var3的取值分组,统计Var1的类别频数,并非按Var1分组统计目标变量的TRUE比例,和你的需求不匹配。 - 场景适配问题:当
Var3全为FALSE时,table的结果里只有FALSE分组,没有TRUE分组,提取$'TRUE'自然返回NULL。
用mean()直接计算比例是更可靠的方式,它会自动处理全FALSE的情况返回0,同时严格匹配按Var1类别统计的需求。
内容的提问来源于stack exchange,提问作者Linus
相关产品推荐
相关产品推荐

