R语言:为含千余列的数据框检测ID1-ID100列行内重复值并新增标记列至Name列前
我来帮你修正这个函数,解决你的两个核心需求:限定检查范围到ID1-ID100列,以及把新增列放到Name列前面。
修正后的函数实现
下面是调整后的完整函数,我会在后面拆解关键改动点:
hasDups <- function(df){ # 1. 精准筛选需要检查的列:ID1 到 ID100 check_cols <- grep("^ID[1-9][0-9]?$|^ID100$", names(df), value = TRUE) # 容错处理:如果没有匹配到目标列,直接返回原数据框并给出提示 if(length(check_cols) == 0){ warning("未找到ID1至ID100的列,返回原数据框") return(df) } # 2. 定义每行重复值检查逻辑(可选择忽略NA的重复) checkDup <- function(x){ # 过滤掉NA值(如果需要把重复的NA也算作重复,就删掉这一行,直接用x) non_na_vals <- x[!is.na(x)] # 非NA值不足2个时,不可能有重复 if(length(non_na_vals) < 2){ return("") } # 判断是否存在重复值,返回对应标记 ifelse(max(table(non_na_vals)) > 1, "duplicate entry", "") } # 3. 为每行生成重复标记 df$hasDup <- apply(df[, check_cols], 1, checkDup) # 4. 调整列顺序:把hasDup插入到Name列之前 name_col_pos <- which(names(df) == "Name") new_col_order <- c( names(df)[1:(name_col_pos-1)], # Name列之前的所有列 "hasDup", # 新增的标记列 names(df)[name_col_pos:ncol(df)] # Name列及之后的所有列 ) df <- df[, new_col_order] return(df) }
关键改动说明
- 限定检查列范围:用正则表达式
^ID[1-9][0-9]?$|^ID100$精准匹配ID1到ID100的列,避免误检查其他列。 - NA值处理:默认过滤掉NA值再检查重复(比如多个NA不会被标记为重复),如果你的需求里需要把重复NA也算作重复,删掉
non_na_vals <- x[!is.na(x)]这一行直接用x即可。 - 列位置调整:通过
which(names(df) == "Name")定位Name列的索引,重新构造列顺序,确保新增列插在它前面。
测试调用
用你提供的示例数据框测试:
result_df <- hasDups(df) # 查看前几行验证结果 head(result_df)
内容的提问来源于stack exchange,提问作者coder2learn
相关产品推荐
相关产品推荐

