如何在R语言DataFrame中统计药物的唯一患者使用次数
摆脱C思维,用R风格高效统计药物患者数
完全懂你从C转R时的那种思维定式困扰!我刚接触R的时候也总忍不住写嵌套循环,不仅代码啰嗦,处理大数据时效率还特别低。你的需求其实用R的向量式操作或者tidyverse工具就能轻松搞定,根本不用绕那么大弯~
先把你的示例数据整理成清晰的DataFrame方便演示:
therapyDF <- data.frame( patientID = c(1, 2, 2, 3, 3, 4), drugname = c("A", "A", "B", "C", "C", "A"), stringsAsFactors = FALSE )
方法一:Base R 实现
核心思路是先去重(每个患者-药物组合只保留一条记录),再统计每种药物的患者数量:
# 第一步:提取唯一的患者-药物配对 unique_patient_drug <- unique(therapyDF[, c("patientID", "drugname")]) # 第二步:统计每种药物对应的患者数 prevalenceDF <- as.data.frame(table(unique_patient_drug$drugname), stringsAsFactors = FALSE) # 重命名列名匹配你的需求 colnames(prevalenceDF) <- c("drugname", "count")
运行后就能得到你想要的结果:
drugname count 1 A 3 2 B 1 3 C 1
方法二:Tidyverse 实现(更简洁直观)
如果你习惯用tidyverse的语法,代码会更紧凑,可读性也更强:
library(dplyr) prevalenceDF <- therapyDF %>% distinct(patientID, drugname) %>% # 保留唯一的患者-药物组合,自动去重 count(drugname, name = "count") # 按药物分组统计,直接指定结果列名为count
这两行代码就完成了所有操作,完全避免了循环,而且处理大数据时的效率比嵌套循环高得多。
为什么你的原方法效率低?
R是向量式编程语言,它的优势在于对整个向量/数据集进行操作,而不是像C那样逐元素循环。嵌套循环会让R反复创建小数据框、逐行判断,不仅代码冗余,处理大规模数据时速度会慢到难以接受。而上面的两种方法都是利用R的内置优化函数,底层是用C/Fortran实现的,效率和可读性都远优于循环写法。
内容的提问来源于stack exchange,提问作者Anthony Nash
相关产品推荐
相关产品推荐

