如何使用dplyr从分组数据中获取频率?
别担心,刚上手用dplyr处理长格式临床数据时,很容易在「统计个体频率」和「统计行频率」上踩坑~我来帮你拆解问题,看看你可能哪里出错了,再给你对应的dplyr解决方案。
为什么table(x$Gender)结果不符合预期?
你提到预期是2名女性、1名男性,但table()结果不对,大概率是因为你的长格式数据里每个患者对应了多行记录——table()函数会把每一行都算进去,而不会自动按患者去重统计。举个例子:如果女性患者A有2条随访记录,女性患者B有1条,男性患者C有1条,那table()会返回Female:3, Male:1,但实际你要的是按患者个体统计的Female:2, Male:1,这就出现了偏差。
用dplyr实现正确的频率统计
假设你的数据集包含PatientID(唯一标识患者)、Gender、Grade这些核心列,分两种情况处理:
情况1:按「唯一患者」统计频率
这是临床数据最常见的需求,先提取每个患者的唯一特征,再统计频率:
library(dplyr) # 第一步:去重,保留每个患者的Gender和Grade信息 unique_patients <- your_dataset %>% distinct(PatientID, Gender, Grade, .keep_all = FALSE) # 只保留需要的变量 # 统计Gender的患者频率 gender_freq <- unique_patients %>% count(Gender, name = "Patient_Count") # 自定义结果列名 # 统计Grade的患者频率 grade_freq <- unique_patients %>% count(Grade, name = "Patient_Count") # 如果需要Gender和Grade的交叉频率表 cross_freq <- unique_patients %>% count(Gender, Grade, name = "Patient_Count")
情况2:数据无重复患者,但table()结果异常
如果你的数据每个患者只有一行,那可能是数据格式问题:比如Gender列存在空格(如"Female"和" Female")、大小写不一致(如"female"和"Female"),或者缺失值被单独计数。可以先清理数据再统计:
# 先排查Gender列的异常值 unique(your_dataset$Gender) # 清理空格+统一格式 cleaned_data <- your_dataset %>% mutate( Gender = trimws(Gender), # 去除首尾空格 Gender = tolower(Gender) # 统一为小写,避免大小写差异 ) # 再用table统计就正常了 table(cleaned_data$Gender)
本质上,table()是对输入向量做行级统计,而长格式临床数据通常存在重复的患者条目,这时候必须先按患者去重,再用dplyr的count()或group_by() + summarise()来实现你要的个体频率统计。
内容的提问来源于stack exchange,提问作者Frederick
相关产品推荐
相关产品推荐

