R语言使用dplyr按ID分组基于日期生成Drug字段序列的实现方法
需求实现方案
针对按ID分组、按日期升序拼接药物序列的需求,可通过以下两种方案实现:
示例数据构造
先运行给定代码生成测试数据框:
df <- data.frame(ID = c(1,1,2,3,4,5,5,6,7,8), dat = seq(as.Date("2021-01-01"), as.Date("2021-03-05"), by="weeks"), drug = c("A","A","B","C","B","B","C","D","C","B"))
方案1:dplyr包实现(语法更简洁)
适合习惯tidyverse生态的用户:
# 未安装dplyr先运行 install.packages("dplyr") library(dplyr) res <- df %>% # 先按ID、日期升序排序,保证组内药物顺序符合要求 arrange(ID, dat) %>% # 按ID分组 group_by(ID) %>% # 拼接drug字段,用逗号作为分隔符 summarise(seq1 = paste(drug, collapse = ",")) %>% ungroup()
运行后直接打印res即可得到预期输出结果。
方案2:base R实现(无需额外安装包)
不想加载第三方包可直接用原生R函数实现:
# 先对数据按ID、日期升序排序 df_sorted <- df[order(df$ID, df$dat), ] # 按ID分组拼接drug字段 res <- aggregate(drug ~ ID, data = df_sorted, FUN = function(x) paste(x, collapse = ",")) # 修改第二列列名匹配预期 colnames(res)[2] <- "seq1"
注意:必须先按日期排序再执行分组拼接操作,若原始数据中同一ID的行顺序打乱,直接拼接会导致生成的序列顺序错误。
内容的提问来源于stack exchange,提问作者Joep_S
相关产品推荐
相关产品推荐

