如何在R中按分组统计变量各取值的出现次数及占比
报错原因
管道符
%>%默认将前序输出作为下一个函数的第一个参数传入,你的代码等价于执行table(group_by(Patient1, Index), Majority_SNP),Majority_SNP是数据框内的列,不是全局环境中的独立变量,因此table函数无法识别对应对象。
解决方案
推荐用tidyverse体系函数直接生成你需要的比例宽表:
library(dplyr) library(tidyr) Pt1_Majority_SNP_Prop <- Patient1 %>% # 按Index、Majority_SNP分组计数 count(Index, Majority_SNP, name = "count") %>% # 按Index分组计算各SNP占比 group_by(Index) %>% mutate(proportion = count / sum(count)) %>% # 转换为宽表匹配目标输出结构 select(-count) %>% pivot_wider( names_from = Majority_SNP, values_from = proportion, values_fill = 0, names_prefix = "Proportion " ) %>% # 调整列名、列顺序适配示例要求 rename(`Proportion dash` = `Proportion -`) %>% select(Index, `Proportion A`, `Proportion G`, `Proportion C`, `Proportion T`, `Proportion dash`)
如果偏好base R实现,也可以用列联表方法:
# 生成Index与SNP的计数列联表 count_table <- xtabs(~ Index + Majority_SNP, data = Patient1) # 按行计算相对频率 prop_table <- as.data.frame(prop.table(count_table, margin = 1))
得到结果后你可以直接用ggplot2等工具绘制对应的频率分布图表。
内容的提问来源于stack exchange,提问作者Teddy_Sea_OR
相关产品推荐
相关产品推荐

