You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 06:46:01