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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:23:15