You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

步骤解释

  1. group_by(x):按原ID分组处理,确保同一原ID的观测放在一起操作
  2. row_number():给每组内的观测按顺序生成序号
  3. ceiling(row_number()/4):将连续4条观测划为一个个体组,生成组索引
  4. x_1生成:第一组保留原ID,后续组通过group_idx -1让序号从1开始,拼接成唯一标识

内容的提问来源于stack exchange,提问作者Rabin KC

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 18:20:55