R语言按多个ID字段分组合并数据框行值的解决方法
R数据框按指定字段分组合并行、整合非NA值实现方案
你原有代码的问题:funs(toString(na.omit(.)))会将列值转为字符串格式,且全NA列会返回空字符串而非保留NA,不符合数值保留、非NA值归并的需求。
从你给出的样例数据看,每个study_id + lab_study_dt + lab_study_time分组下,每个检验/检出限指标列最多存在1个非NA值,只需要分组后提取每列的首个非NA值即可得到目标结果。
dplyr 实现(适配新版dplyr语法)
library(dplyr) result <- df %>% group_by(study_id, lab_study_dt, lab_study_time) %>% summarise( across(everything(), ~ first(na.omit(.))), .groups = "drop" )
- 如果同组某列存在多个非NA值需要拼接展示,将
first(na.omit(.))替换为paste(na.omit(.), collapse = ", ")即可,不会出现全NA列转空字符串的问题。
data.table 实现(适合百万行级大数据量场景,性能更优)
library(data.table) setDT(df) result <- df[, lapply(.SD, function(x) first(na.omit(x))), by = c("study_id", "lab_study_dt", "lab_study_time")]
注意事项
你给出的预期结果样例中lab_rbc_count值为1000,但原始样例数据中该分组下对应值为10000,属于手误偏差,上述代码会保留原始数据的真实值,如果你确实需要调整该值可在得到结果后单独做数值替换。
内容的提问来源于stack exchange,提问作者Nishad Gulvady
相关产品推荐
相关产品推荐

