如何在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
相关产品推荐
相关产品推荐

