如何在R语言中按患者与日期生成就诊次数序列字段
在R语言中为每位患者生成就诊次数字段
核心需求是按患者姓名分组,根据就诊日期的先后顺序,为每位患者生成递增的就诊次数编号。以下是两种实现方案:
方法一:使用dplyr包(简洁直观)
需要先加载dplyr和lubridate包(后者用于日期格式转换):
library(dplyr) library(lubridate)
假设你的原始数据如下:
df <- data.frame(paitent=c('Sally', 'Josh', 'Josh', 'Abram','Sally', 'Josh'), visit=mdy(c('2/10/2022', '2/11/2022', '2/12/2022', '2/13/2022', '2/14/2022', '2/15/2022')))
执行以下代码生成visit_count字段:
df <- df %>% group_by(paitent) %>% # 按患者姓名分组 arrange(visit, .by_group = TRUE) %>% # 分组内按就诊日期排序(确保顺序正确) mutate(visit_count = row_number()) %>% # 生成组内递增序号 ungroup() # 取消分组,恢复普通数据框结构
说明:
group_by(paitent):将数据按患者姓名拆分独立分组arrange(visit, .by_group = TRUE):确保每组内的记录按就诊日期从小到大排序,即使原始数据顺序混乱也能正确计数row_number():在每个分组内生成从1开始的连续整数,正好对应每位患者的就诊次数
方法二:使用Base R(无需额外安装包)
如果不想加载第三方包,可以用Base R的原生函数实现:
- 先按患者姓名和就诊日期排序数据:
df_sorted <- df[order(df$paitent, df$visit), ]
- 用
ave()函数生成分组内的递增序号:
df_sorted$visit_count <- ave(rep(1, nrow(df_sorted)), df_sorted$paitent, FUN = seq_along)
- 如果需要恢复原始数据的顺序,可通过合并找回:
df <- merge(df, df_sorted[, c("paitent", "visit", "visit_count")], by = c("paitent", "visit"))
说明:
order(df$paitent, df$visit):生成按患者、日期排序的索引ave(..., FUN = seq_along):对每个患者分组,生成从1开始的连续序号
内容的提问来源于stack exchange,提问作者Gary-c
相关产品推荐
相关产品推荐

