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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:10:38