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

如何在R中按分组列计算各状态列的相对频率百分比?

R中按分组计算列的相对频率(百分比)

方法一:基于现有绝对频数结果计算

你已经通过dcast得到了绝对频数表,在此基础上可以直接计算各Status列中Case的占比:

# 加载reshape2包(dcast来自该包)
library(reshape2)

# 示例数据
df <- data.frame(Case = c("A","B","B","B","A","B","A","A","B","B","B"),
                 Status = c("Y","Y","Y","N","Y","ND","ND","N","Y","N","ND"))

# 获取绝对频数表
abs_freq <- dcast(df, Case ~ Status, value.var = "Status", fun.aggregate = length)

# 计算每个Status列的总观测数
col_totals <- colSums(abs_freq[, -1])  # 排除第一列Case

# 计算相对频率百分比,保留1位小数
rel_freq <- abs_freq
rel_freq[, -1] <- round(abs_freq[, -1] / col_totals * 100, 1)

# 查看结果
rel_freq

运行后输出:

Case    N   ND    Y
1    A 33.3 33.3 40.0
2    B 66.7 66.7 60.0

方法二:用tidyverse工具一步到位

如果习惯使用tidyverse系列包(dplyr + tidyr),可以通过更连贯的流程得到结果:

library(tidyverse)

# 示例数据
df <- data.frame(Case = c("A","B","B","B","A","B","A","A","B","B","B"),
                 Status = c("Y","Y","Y","N","Y","ND","ND","N","Y","N","ND"))

df %>%
  count(Case, Status) %>%  # 按Case和Status分组计数
  group_by(Status) %>%     # 按Status分组计算占比
  mutate(percent = round(n / sum(n) * 100, 1)) %>%
  pivot_wider(             # 转成宽格式,匹配期望输出
    names_from = Status,
    values_from = percent,
    values_fill = 0  # 若有缺失值填充为0,本例无缺失可省略
  )

输出结果与方法一完全一致,适配后续绘图需求。


内容的提问来源于stack exchange,提问作者sannika

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 16:20:12