在R中基于data.table逐行校验多列字符串一致性
解决data.table多列属性一致性校验的问题
针对你需要标记每行x、y、z三列是否完全相等的需求,这里提供几个适配data.table风格的高效解决方案,轻松从两列扩展到多列:
方案一:灵活扩展的逐列比较法(支持任意多列)
如果后续可能增加更多需要校验的列,用Reduce配合.SD的写法最灵活,不需要修改核心逻辑:
library(data.table) DT <- data.table(x = c("Good","Average","Bad"), y = c("Good","Average","Bad"), z = c("Average","Average","Bad")) # 定义需要校验的列集合 check_cols <- c("x", "y", "z") # 逐列递推比较,最终将逻辑结果转为1/0整数 DT[, all.equal := as.integer(Reduce(`==`, .SD)), .SDcols = check_cols]
原理是Reduce会依次把==应用到每一列:先比较x和y得到逻辑向量,再用这个结果和z比较,最终得到每行所有列是否完全相等的判断,转成整数后就是你要的标记。
方案二:硬编码直接比较(列数固定时更直观)
如果列数固定且不多,直接写逻辑表达式可读性更高:
DT[, all.equal := as.integer(x == y & y == z)]
这种写法简单直接,三列的情况下一眼就能看懂逻辑,运行效率也很高。
方案三:统计每行唯一值数量
另一种思路是统计每行的唯一元素个数,若唯一值数量为1则说明所有列相等:
DT[, all.equal := as.integer(uniqueN(.SD) == 1), .SDcols = check_cols, by = 1:nrow(DT)]
这里by = 1:nrow(DT)指定按每行分组,uniqueN(.SD)统计该行的唯一值数量,等于1就标记为1,否则为0。
运行以上任意方案后,你都会得到符合预期的结果:
x y z all.equal 1: Good Good Average 0 2: Average Average Average 1 3: Bad Bad Bad 1
内容的提问来源于stack exchange,提问作者Roel
相关产品推荐
相关产品推荐

