如何在R中按唯一ID统计重复测量数据的DX频次表
解决方案
要实现按唯一ID统计各DX类别的出现次数(即有多少不同ID包含该DX),核心是先对每个ID的DX去重,再统计频次:
Base R 实现
# 提取每个ID对应的唯一DX值并展开 dx_by_id <- unlist(tapply(df$DX, df$ID, unique)) # 统计每个DX对应的ID数量 tbl <- table(dx_by_id) # 计算百分比(分母为唯一ID总数) total_unique_ids <- length(unique(df$ID)) result <- cbind( Count = tbl, Percentage = round(prop.table(tbl) * 100, 2) ) # 调整行名 rownames(result) <- names(tbl) result
输出结果:
Count Percentage A 3 100.00 B 3 100.00 C 1 33.33
dplyr 简洁实现
如果习惯用tidyverse工具链,代码更直观:
library(dplyr) df %>% distinct(ID, DX) %>% # 保留每个ID下的唯一DX组合 count(DX, name = "Count") %>% mutate(Percentage = round(Count / n_distinct(df$ID) * 100, 2))
逻辑说明
- 去重处理:通过
distinct(ID, DX)或tapply+unique,先得到每个ID对应的不重复DX值,避免同一ID内的重复DX被多次计数; - 统计频次:对去重后的DX列计数,得到的就是包含该DX的唯一ID数量;
- 计算百分比:以唯一ID的总数(这里是3)作为分母,计算每个DX类别的占比。
内容的提问来源于stack exchange,提问作者Bruh
相关产品推荐
相关产品推荐

