在R语言中用group_by计算分组内Ratio>1记录的占比问题
问题解决:按Scenario分组计算Ratio>1的记录占比
错误原因分析
你代码里的nrow(pass)是核心问题:pass是单个列向量,nrow()仅适用于数据框或矩阵,对向量调用会返回NULL,导致计算逻辑失效,最终得到空tibble。分组场景下,获取每组观测数应该用dplyr内置的n()函数,它会自动匹配当前分组的行数。
修正后的代码(保留pass列的写法)
library(dplyr) # 原添加pass列的代码无需修改 df$pass = with(df, ifelse(Ratio>1, 1, 0)) # 修正分组统计逻辑 df_pct <- df %>% group_by(Scenario) %>% summarise(pass_pct = sum(pass)/n())
更优实现(无需额外添加pass列)
完全不用提前创建pass列,利用R中逻辑值自动转为1(TRUE)和0(FALSE)的特性,直接用mean()计算占比,代码更简洁高效:
library(dplyr) df_pct <- df %>% group_by(Scenario) %>% summarise(pass_pct = mean(Ratio > 1))
如果需要将结果转为百分比格式(比如保留一位小数),可以补充处理:
df_pct <- df %>% group_by(Scenario) %>% summarise(pass_pct = scales::percent(mean(Ratio > 1), accuracy = 0.1))
内容的提问来源于stack exchange,提问作者5imon
相关产品推荐
相关产品推荐

