如何在R语言中识别并重命名列中重复ID的取值
重复猪ID的数据集清洗方案
原数据集
生成数据的代码:
set.seed(42) x <- c("a","a","a","a","b","b","b","b","c","c","c","c","a","a","a","a") r <- c(1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4) y <- c(round(rnorm(16,77,24))) df <- as.data.frame(cbind(x,r,y)) # 修正数据类型(cbind会将数值转为字符型) df$r <- as.integer(df$r) df$y <- as.integer(df$y)
原数据输出:
x r y 1 a 1 110 2 a 2 63 3 a 3 86 4 a 4 92 5 b 1 87 6 b 2 74 7 b 3 113 8 b 4 75 9 c 1 125 10 c 2 75 11 c 3 108 12 c 4 132 13 a 1 44 14 a 2 70 15 a 3 74 16 a 4 92
需求说明
x列是猪的ID,每个个体对应连续4条观测,但ID"a"被重复用于不同个体,需要新增x_1列,区分同一原ID下的不同个体,确保每组4条观测对应唯一的x_1值。
解决方案(使用dplyr)
核心逻辑是按原ID分组,将每组内连续4条观测标记为同一个体,生成唯一标识。
代码实现
library(dplyr) df_clean <- df %>% group_by(x) %>% mutate( # 每4条观测划分为一个个体组 group_idx = ceiling(row_number() / 4), # 生成唯一标识:第一组保留原ID,后续组在ID后加序号(从1开始) x_1 = paste0(x, ifelse(group_idx == 1, "", group_idx - 1)) ) %>% # 调整列顺序并移除临时索引列 select(x, x_1, r, y) %>% ungroup() # 查看清洗后的数据 df_clean
输出结果
# A tibble: 16 × 4 x x_1 r y <chr> <chr> <int> <int> 1 a a 1 110 2 a a 2 63 3 a a 3 86 4 a a 4 92 5 b b 1 87 6 b b 2 74 7 b b 3 113 8 b b 4 75 9 c c 1 125 10 c c 2 75 11 c c 3 108 12 c c 4 132 13 a a1 1 44 14 a a1 2 70 15 a a1 3 74 16 a a1 4 92
步骤解释
group_by(x):按原ID分组处理,确保同一原ID的观测放在一起操作row_number():给每组内的观测按顺序生成序号ceiling(row_number()/4):将连续4条观测划为一个个体组,生成组索引x_1生成:第一组保留原ID,后续组通过group_idx -1让序号从1开始,拼接成唯一标识
内容的提问来源于stack exchange,提问作者Rabin KC
相关产品推荐
相关产品推荐

