如何合并data.table两行:保留一行指定列值并删除另一行
解决方案
首先明确需求:按column3分组,组内行数大于1时,保留指定行,并用组内另一行的column2值替换保留行的column2,最终每组只留一行。
先把示例数据用data.table构造:
library(data.table) dt <- data.table( column1 = c(1,2,5), column2 = c(1,3,6), column3 = c(1,4,4) )
实现代码
merge_rows <- function(dt, group_col, keep_condition, replace_cols) { # 按分组列处理每组 dt[, { if (.N == 1) { # 组内只有一行,直接返回 .SD } else { # 筛选要保留的行 keep_row <- .SD[eval(parse(text = keep_condition))] # 筛选要删除的行,提取需要替换的列值 replace_vals <- .SD[!eval(parse(text = keep_condition)), ..replace_cols] # 替换保留行的对应列 keep_row[, (replace_cols) := replace_vals] # 返回处理后的保留行 keep_row } }, by = group_col] } # 调用函数:按column3分组,保留column1==5的行,替换column2列 result <- merge_rows(dt, "column3", "column1 == 5", "column2") print(result)
代码说明
group_col:指定分组的列(这里是column3)keep_condition:字符串形式的保留行条件(比如"column1 == 5",或者更通用的"column1 == max(column1)")replace_cols:需要替换的列名(这里是column2)
运行后得到的结果与期望一致:
column3 column1 column2 1: 1 1 1 2: 4 5 3
更通用的版本(无需指定具体值)
如果需求是保留每组中column1最大的行,并用组内其他行的column2替换,可以把条件改成"column1 == max(column1)",适配任意数值的分组:
result <- merge_rows(dt, "column3", "column1 == max(column1)", "column2")
原代码的问题
- 索引处理错误:删除行后原索引失效,后续赋值会指向错误的行
anyDuplicated用法错误:用它判断分组是否有重复,但实际需要的是分组内行数大于1的情况- 替换逻辑混乱:先取第一行的列值又替换回去,完全不符合需求
内容的提问来源于stack exchange,提问作者Tessa
相关产品推荐
相关产品推荐

