如何从R data.frame计算排除Correct变量的条件比例?
问题描述
现有一个保存为频率表的多维交叉表,数据结构如下:
df = data.frame( Correct = c('yes','no','yes','no','yes','no','yes','no', 'yes','no','yes','no','yes','no','yes','no'), Type = c('t1','t1','t2','t2','t1','t1','t2','t2', 't1','t1','t2','t2','t1','t1','t2','t2'), Subtype = c('st1','st1','st1','st1','st2','st2','st2','st2', 'st1','st1','st1','st1','st2','st2','st2','st2'), Level = c('a','a','a','a','a','a','a','a', 'b','b','b','b','b','b','b','b'), Freq = c(115,99,140,81,104,100,156,52,61,160,59,164,41,160,48,159) )
需要将Freq列重新计算为以除Correct外的所有变量为条件的比例,生成新变量Prop,最终结果需保留两位小数匹配示例格式。
解决方案
方法1:dplyr(tidyverse)实现
这是tidy风格的常用写法,按分组变量计算组内占比:
library(dplyr) df <- df %>% group_by(Type, Subtype, Level) %>% mutate(Prop = round(Freq / sum(Freq), 2)) %>% ungroup()
group_by(Type, Subtype, Level):指定除Correct外的所有变量作为分组依据mutate():生成新列Prop,用当前行Freq除以组内Freq总和,round()保留两位小数
方法2:data.table实现
适合处理大数据集,执行效率更高:
library(data.table) setDT(df) df[, Prop := round(Freq / sum(Freq), 2), by = .(Type, Subtype, Level)]
setDT():将普通data.frame转换为data.table格式by = .(Type, Subtype, Level):定义分组条件,直接在原表新增Prop列
方法3:基础R实现
无需加载任何扩展包,用ave()函数完成分组计算:
df$Prop <- with(df, round(Freq / ave(Freq, Type, Subtype, Level, FUN = sum), 2))
ave(Freq, Type, Subtype, Level, FUN = sum):按分组变量计算每组的Freq总和- 用原
Freq除以组内总和后,保留两位小数得到Prop列
内容的提问来源于stack exchange,提问作者striatum
相关产品推荐
相关产品推荐

