重命名重复的列值组为另一列

Rename duplicated column values group by another column

提问人:cliu 提问时间:7/5/2023 最后编辑:cliu 更新时间:7/5/2023 访问量:74

问:

我有一个数据集,其中相同的 id 出现在不同的组中:

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)

我想重命名列下按另一列分组的重复值。预期输出为:idgroup

   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

我该怎么做?

r dplyr 重复重 命名 数据操作

评论


答:

1赞 SamR 7/5/2023 #1

下面是使用 rleid() 为每个唯一和组合生成运行长度 id 的方法。然后,我们可以将该数字转换为现有的 ,它所在的位置。data.tableidgrouppaste()id>1

library(data.table)
setDT(df)

df[, id_num := rleid(group), id][
    ,
    id := fifelse(
        id_num == 1,
        as.character(id),
        paste(id, id_num, sep = "_")
    )
][, `:=`(id_num = NULL)]

print(df)

#         id  group
#     <char> <char>
#  1:      1      A
#  2:      2      A
#  3:      2      A
#  4:    1_2      B
#  5:    1_2      B
#  6:    2_2      B
#  7:    2_3      C
#  8:    2_3      C
#  9:    1_3      C
# 10:    2_4      D
# 11:    1_4      D
# 12:    1_4      D

评论

1赞 cliu 7/5/2023
谢谢你的回答。请参阅下面的版本tidyverse
1赞 cliu 7/5/2023 #2

感谢@SamR的回答。我能够使用 Chatgpt 将他/她的代码转换为一个版本:data.tabletidyverse

df %>%
  mutate(id_num = data.table::rleid(group)) %>%
  mutate(id = ifelse(id_num == 1, as.character(id), paste(id, id_num, sep = "_"))) %>%
  select(-id_num)

评论

0赞 Onyambu 7/5/2023
为什么需要 In Tidyverse?只需使用data.table::rleiddplyr::consecutive_id