如何根据重复的case列修改data.table中的exclusion列值?
解决data.table按case修正多列排除标记的问题
需求说明
现有含重复case项的data.table,包含1个case列与4个值为TRUE/FALSE的排除列(exclusion列)。需按以下规则处理每个case分组下的排除列:
- 若某排除列同时存在
TRUE和FALSE,将该列所有TRUE替换为FALSE - 若某排除列全为
TRUE或全为FALSE,保持原数据不变
实现代码
1. 示例数据准备
library(data.table) # 构造测试数据 dt <- data.table( case = c(1,1,2,2,3,3), excl1 = c(TRUE, FALSE, TRUE, TRUE, TRUE, TRUE), excl2 = c(FALSE, FALSE, TRUE, FALSE, TRUE, FALSE), excl3 = c(TRUE, TRUE, FALSE, FALSE, FALSE, FALSE), excl4 = c(FALSE, TRUE, TRUE, TRUE, FALSE, FALSE) )
2. 批量处理排除列
# 指定需要处理的排除列名称 excl_cols <- c("excl1", "excl2", "excl3", "excl4") # 按case分组,批量修正每个排除列 dt[, (excl_cols) := lapply(.SD, function(col) { # 判断当前列是否同时存在TRUE和FALSE has_both_values <- uniqueN(col) == 2 if (has_both_values) { # 将TRUE替换为FALSE,FALSE保持不变 fifelse(col == TRUE, FALSE, col) } else { # 无混合值,返回原列 col } }), by = case, .SDcols = excl_cols]
3. 按case去重(可选)
处理完成后,直接按case去重即可得到唯一记录:
unique_dt <- unique(dt, by = "case")
代码说明
.SDcols:指定需要处理的目标列,.SD代表这些列组成的数据子集uniqueN(col):高效计算列中唯一值的数量,判断是否存在混合的TRUE/FALSEfifelse:data.table专属的条件替换函数,性能优于base包的ifelse- 分组操作
by = case:确保每个case下的列独立处理
内容的提问来源于stack exchange,提问作者Flow91
相关产品推荐
相关产品推荐

