如何在dplyr中结合group_by实现均值、求和及有效样本量统计
解决方法
你可以直接在across的函数列表中新增有效样本量的计算逻辑即可,R中统计非NA值的数量可通过sum(!is.na(列名))实现,修改后的代码如下:
df <- df %>% group_by(Year, `School Name`) %>% summarise( across(where(is.numeric), .f = list( mean = ~mean(.x, na.rm = TRUE), valid_n = ~sum(!is.na(.x)) )) )
代码说明
- 用
where(is.numeric)限定仅对数值列做计算,避免分组用的年份、学校名字段被错误处理 - 每个得分列会生成两个结果列:后缀为
_mean的是平均得分,后缀为_valid_n的是计算该均值时用到的有效样本量(即该列在分组内非NA的数值个数) - 不要直接用
n()统计样本量,n()返回的是分组内的总记录数,不会排除对应列是NA的记录,不符合有效样本量的统计需求
如果你需要统计分组内至少有一门成绩非NA的学生总数,可以在summarise中额外新增计算逻辑:
df <- df %>% group_by(Year, `School Name`) %>% summarise( across(where(is.numeric), .f = list( mean = ~mean(.x, na.rm = TRUE), valid_n = ~sum(!is.na(.x)) )), # 统计至少有一个得分非NA的学生总数 total_valid_stu = sum(if_all(starts_with("Student Score"), ~!is.na(.x))) )
内容的提问来源于stack exchange,提问作者vpatel
相关产品推荐
相关产品推荐

