如何按ID列分组并拼接同一ID对应的多行列字段内容
修正方案
原有代码问题点
- 语法错误:字段筛选行后直接拼接
head()语句,无分隔符;aggregate计算结果未赋值,导出的还是原始数据 - 逻辑遗漏:未将同ID下唯一的
Name字段加入分组条件,最终结果会丢失Name列 - 变量名错误:aggregate调用的数据集名写为
df,实际加载的数据集名为diagnoses - 未做类型兼容处理:直接拼接不同类型字段可能触发类型报错
可用代码(两种实现)
1. 基于base R的aggregate实现(沿用你原本的写法逻辑)
# 加载依赖包 library(readxl) library(openxlsx) # 读取数据并保留目标字段 diagnoses <- read_xlsx("excel file.xlsx") diagnoses <- diagnoses[,c("ID" ,"Name" ,"Diagnosis" ,"Medicine")] head(diagnoses) # 按ID+Name分组拼接,as.character适配多数据类型 result <- aggregate( cbind(Diagnosis, Medicine) ~ ID + Name, data = diagnoses, FUN = function(x) paste0(as.character(x), collapse = '|') ) # 导出结果 write.xlsx(result, "Diagnoses.xlsx")
2. 基于dplyr的tidyverse风格实现
# 加载依赖包 library(readxl) library(openxlsx) library(dplyr) # 读取+处理+导出全流程 read_xlsx("excel file.xlsx") %>% select(ID, Name, Diagnosis, Medicine) %>% group_by(ID, Name) %>% summarise( Diagnosis = paste0(as.character(Diagnosis), collapse = "|"), Medicine = paste0(as.character(Medicine), collapse = "|"), .groups = "drop" ) %>% write.xlsx("Diagnoses.xlsx")
说明
代码中增加的as.character()转换逻辑,适配你数据中的integer、bit、nvarchar等不同字段类型,拼接前统一转为字符格式,避免类型不兼容报错。两种实现输出的结果都和你预期的格式完全一致。
内容的提问来源于stack exchange,提问作者paru80
相关产品推荐
相关产品推荐

