R中按多列合并行并自动取各列最后非空值的实现方案
方案1:纯dplyr实现(自动适配所有非分组列)
先定义通用取值函数,支持你提到的三类MUSH场景灵活切换,无需调整聚合逻辑:
library(dplyr) # 可按需修改取值规则 get_target_val <- function(x) { # 取最后一个非空值:last(na.omit(x)) # 取第一个非空值:first(na.omit(x)) # 取最后一个值(无论是否为空):last(x) last(na.omit(x)) } # 聚合逻辑完全不绑定非分组列,新增字段无需修改代码 res <- d %>% group_by(STUDENTID, SUBJECT) %>% summarise(across(everything(), get_target_val), .groups = "drop")
该方案直接按分组返回单行结果,比原实现的mutate+去重逻辑更简洁,运行结果与预期完全一致。
方案2:data.table实现(性能更优,适合大数据量场景)
如果日常处理数据量级较大,data.table的执行效率会更高,同样支持自动适配所有非分组列:
library(data.table) setDT(d) # 转换为data.table格式 # 通用取值函数,规则修改同上 get_target_val <- function(x) { last(na.omit(x)) } # 按分组聚合 res <- d[, lapply(.SD, get_target_val), by = .(STUDENTID, SUBJECT)]
内容的提问来源于stack exchange,提问作者imfm
相关产品推荐
相关产品推荐

