如何按group列分组重命名id列的重复值?
按Group分组重命名重复ID的实现方法
问题背景
现有如下数据集,其中同一id会出现在不同group中:
df <- read.table(text='id group 1 A 2 A 2 A 1 B 1 B 2 B 2 C 2 C 1 C 2 D 1 D 1 D', header=TRUE)
需要按group列分组,对id列的重复值进行重命名,预期输出如下:
id group 1 A 2 A 2 A 1_2 B 1_2 B 2_2 B 2_3 C 2_3 C 1_3 C 2_4 D 1_4 D 1_4 D
实现方案
可以通过dplyr包的分组、排序和拼接操作实现,具体代码如下:
# 加载dplyr包 library(dplyr) # 处理数据 df_processed <- df %>% # 去重得到每个id对应的group集合 distinct(id, group) %>% # 按id分组,给每个group分配顺序编号 group_by(id) %>% mutate(seq = row_number()) %>% ungroup() %>% # 将顺序编号合并回原始数据集 right_join(df, by = c("id", "group")) %>% # 生成新的id列:seq=1时用原id,否则拼接id和seq mutate(new_id = ifelse(seq == 1, as.character(id), paste(id, seq, sep = "_"))) %>% # 调整列顺序并重命名 select(new_id, group) %>% rename(id = new_id) # 查看结果 print(df_processed)
代码逻辑说明:
- 先对每个
id的group去重,确定每个id对应的group出现顺序并分配序号 - 将序号合并回原数据集,根据序号判断是否需要拼接
id和序号:第一个出现的group保留原id,后续group则拼接成id_序号的格式 - 最后调整列顺序并完成重命名,得到符合预期的结果
内容的提问来源于stack exchange,提问作者cliu
相关产品推荐
相关产品推荐

