R语言按x、y、cell_id指定列将多行合并为单行的高效方法
最高效处理方案(基于R的data.table包,60万行数据可秒级完成)
data.table底层为C实现,是R生态中处理结构化数据性能最高的工具,完全适配你的需求:
步骤1:加载包并转换数据格式
# 未安装先运行 install.packages("data.table") library(data.table) # 假设你的原始数据框名为raw_df,转为data.table对象 setDT(raw_df)
步骤2:定义分组与聚合规则
# 分组键:x、y、cell_id、population(若同分组下population不唯一,可移到聚合逻辑中取首值/均值) group_keys <- c("x", "y", "cell_id", "population") # 匹配所有需要合并的数值列,前缀根据你的实际字段调整: # 如果是output开头就写 "^output\\d+$",如果是infected_DM开头就写 "^infected_DM_\\d+$" value_cols <- grep("^infected_DM_\\d+$", names(raw_df), value = TRUE)
步骤3:分组聚合
# 聚合逻辑可按需调整: # 同列多值相加用sum,同列只要出现非0值就取1用 function(x) as.integer(any(x > 0)),取最大值用max,取第一个非0值用 function(x) {res <- x[x!=0][1]; ifelse(is.na(res), 0, res)} result <- raw_df[, lapply(.SD, sum), by = group_keys, .SDcols = value_cols]
步骤4:补全缺失的output列(无值补0)
# 生成0到999所有要求的列名,前缀和上面保持一致 all_cols <- paste0("infected_DM_", 0:999) # 补全缺失列,默认值为0 missing_cols <- setdiff(all_cols, names(result)) result[, (missing_cols) := 0] # 调整列顺序,分组列在前,output列按数字顺序排列 setcolorder(result, c(group_keys, sort(all_cols)))
可选:转回普通data.frame格式
setDF(result)
内容的提问来源于stack exchange,提问作者zeizeiv9
相关产品推荐
相关产品推荐

