删除重复值,需要为 R 中删除的重复项分配唯一变量

Remove duplicate values and need to assign a unique variable to removed duplicates in R

提问人:Regan Myers 提问时间:11/16/2023 最后编辑:Darren TsaiRegan Myers 更新时间:11/17/2023 访问量:63

问:

我有一个带有名称的序列数据集,我需要删除我通过使用完成的重复项

my_data(my_data[!duplicated(my_data$Sequence),])

其中是我的文件名,我的数据文件是my_data

  Name      Sequence
1 KR820422  MAGRSGDSDATLLQAVKIIKILYQSNPYPKPEGTRQARKNRRRRWRARQRQIRAISERILSDCLGRPAEPVPLQLPPIERLNINCNESGGTSGTQQPQGNTKGVGSP*
2 KR820423  MAGRSGDSDATLLQAVKIIKILYQSNPYPKPEGTRQARKNRRRRWRARQRQIRAISERILSDCLGRPAEPVSLQLPPIERLNINCNESGGTSGTQQPQGNTEGVGSP*
3 KR820424  MAGRSGDSDATLLQAVKIIKILYQSNPYPKPEGTRQARKNRRRRWRARQRQIRAISERILSDCLGRPAEPVSLQLPPIERLNINCNESGGTSGTQQPQGNTEGVGSP*
4 KR820425  MAGRSGDSDATLLQAVKIIKILYQSNPYPKPEGTRQARKNRRRRWRARQRQIRAISERILSDCLGRPAEPVSLQLPPIERLNINCNESGGTSGTQQPQGNTEGVGSP*
5 KR820426  MAGRSGDSDATLLQAVKIIKILYQSNPYPKPEGTRQARKNRRRRWRARQRQIRAISERILSDCLGRPAEPVPLQLPPIERLNINCNESGGTSGTQQPQGNTEGVGSP*
6 KR820427  MAGRSGDSDATLLQAVKIIKILYQSNPYPKPEGTRQARKNRRRRWRARQRQIRAISERILSDCLGRPAEPVPLQLPPIERLNINCNKSGGTSGTQQPQGNTEGVGSS*

我需要为每个唯一的副本分配唯一的变量 A、B、C、D 等。最终目标是将分配了 A、B、C 等的每个唯一重复序列分配回原始序列,以便有 3 列

名字 序列 变量
名称 1 序列 1 一个
名称 2 序列 2 B
名称 3 序列 3 一个

其中,序列 1 和 3 都有重复的序列 A。

感谢您的任何时间并帮助解决这个问题!!一直在尝试一些事情,但还不能让它工作

数据:

df <- data.frame(
  Name = c("KR820422", "KR820423", "KR820424", "KR820425", "KR820426", "KR820427"),
  Sequence = c(
    "MAGRSGDSDATLLQAVKIIKILYQSNPYPKPEGTRQARKNRRRRWRARQRQIRAISERILSDCLGRPAEPVPLQLPPIERLNINCNESGGTSGTQQPQGNTKGVGSP*",
    "MAGRSGDSDATLLQAVKIIKILYQSNPYPKPEGTRQARKNRRRRWRARQRQIRAISERILSDCLGRPAEPVSLQLPPIERLNINCNESGGTSGTQQPQGNTEGVGSP*",
    "MAGRSGDSDATLLQAVKIIKILYQSNPYPKPEGTRQARKNRRRRWRARQRQIRAISERILSDCLGRPAEPVSLQLPPIERLNINCNESGGTSGTQQPQGNTEGVGSP*",
    "MAGRSGDSDATLLQAVKIIKILYQSNPYPKPEGTRQARKNRRRRWRARQRQIRAISERILSDCLGRPAEPVSLQLPPIERLNINCNESGGTSGTQQPQGNTEGVGSP*",
    "MAGRSGDSDATLLQAVKIIKILYQSNPYPKPEGTRQARKNRRRRWRARQRQIRAISERILSDCLGRPAEPVPLQLPPIERLNINCNESGGTSGTQQPQGNTEGVGSP*",
    "MAGRSGDSDATLLQAVKIIKILYQSNPYPKPEGTRQARKNRRRRWRARQRQIRAISERILSDCLGRPAEPVPLQLPPIERLNINCNKSGGTSGTQQPQGNTEGVGSS*"
  ))
R 数据帧 DPLYR

评论

0赞 neilfws 11/16/2023
请花一些时间编辑这个问题 - 很难看到数据的样子。
0赞 Mark 11/16/2023
嗨,里根!欢迎使用 StackOverflow。'rev(rev) 真的很难读,请考虑更改它
0赞 Regan Myers 11/16/2023
会做的!我试图更改数据以使其更容易查看。发布后我意识到,我的数据看起来有点像垃圾箱火灾。希望新格式有所帮助!对不起!!
0赞 Mark 11/16/2023
你想要这样的东西吗?请记住,有了这个,您将在第 26 个唯一序列之后用完字母mutate(df, id = LETTERS[consecutive_id(Sequence)])
1赞 Mark 11/16/2023
没有压力!提出 R 问题时的一般最佳实践是 1。解释你想做什么, 2.你被困在什么地方, 3.你试过什么, 4.给出一个小样本输入,然后 5.所需的输出。如果你能做到这些事情,你就会跻身提问者的前 1%,而且你会很快得到答案

答:

1赞 maike 11/17/2023 #1

我稍微重新排序了您的数据框,因此其中一个重复项位于不同的序列之后,因为我认为这是您首先在评论中的建议中缺少的内容。当然,额外的匹配步骤工作得很好,但是如果将 Sequence 转换为因子,它实际上会存储为整数值,从而允许您按照建议进行索引。 如果你有太多不同的序列,可以考虑只把 V1、V2、...在 Variable2 中完成。LETTERS

为了进行比较,我添加了一个选项,该选项不适合在数据集中查找重复项。consecutive_id()

library(dplyr)
library(forcats)

df <- data.frame(
  Name = c("KR820422", "KR820423", "KR820424", "KR820425", "KR820426", "KR820427"),
  Sequence = c(
    "MAGRSGDSDATLLQAVKIIKILYQSNPYPKPEGTRQARKNRRRRWRARQRQIRAISERILSDCLGRPAEPVPLQLPPIERLNINCNESGGTSGTQQPQGNTKGVGSP*",
    "MAGRSGDSDATLLQAVKIIKILYQSNPYPKPEGTRQARKNRRRRWRARQRQIRAISERILSDCLGRPAEPVSLQLPPIERLNINCNESGGTSGTQQPQGNTEGVGSP*",
    "MAGRSGDSDATLLQAVKIIKILYQSNPYPKPEGTRQARKNRRRRWRARQRQIRAISERILSDCLGRPAEPVSLQLPPIERLNINCNESGGTSGTQQPQGNTEGVGSP*",
    "MAGRSGDSDATLLQAVKIIKILYQSNPYPKPEGTRQARKNRRRRWRARQRQIRAISERILSDCLGRPAEPVSLQLPPIERLNINCNESGGTSGTQQPQGNTEGVGSP*",
    "MAGRSGDSDATLLQAVKIIKILYQSNPYPKPEGTRQARKNRRRRWRARQRQIRAISERILSDCLGRPAEPVPLQLPPIERLNINCNESGGTSGTQQPQGNTEGVGSP*",
    "MAGRSGDSDATLLQAVKIIKILYQSNPYPKPEGTRQARKNRRRRWRARQRQIRAISERILSDCLGRPAEPVPLQLPPIERLNINCNKSGGTSGTQQPQGNTEGVGSS*"
  )) %>% 
  slice(c(1, 2, 3, 5, 6, 4))


df %>% 
  mutate(
    Sequence = factor(Sequence) %>% fct_inorder(),
    Variable = LETTERS[Sequence],
    Variable2 = paste0('V', as.numeric(Sequence))
  ) 
#>       Name
#> 1 KR820422
#> 2 KR820423
#> 3 KR820424
#> 4 KR820426
#> 5 KR820427
#> 6 KR820425
#>                                                                                                       Sequence
#> 1 MAGRSGDSDATLLQAVKIIKILYQSNPYPKPEGTRQARKNRRRRWRARQRQIRAISERILSDCLGRPAEPVPLQLPPIERLNINCNESGGTSGTQQPQGNTKGVGSP*
#> 2 MAGRSGDSDATLLQAVKIIKILYQSNPYPKPEGTRQARKNRRRRWRARQRQIRAISERILSDCLGRPAEPVSLQLPPIERLNINCNESGGTSGTQQPQGNTEGVGSP*
#> 3 MAGRSGDSDATLLQAVKIIKILYQSNPYPKPEGTRQARKNRRRRWRARQRQIRAISERILSDCLGRPAEPVSLQLPPIERLNINCNESGGTSGTQQPQGNTEGVGSP*
#> 4 MAGRSGDSDATLLQAVKIIKILYQSNPYPKPEGTRQARKNRRRRWRARQRQIRAISERILSDCLGRPAEPVPLQLPPIERLNINCNESGGTSGTQQPQGNTEGVGSP*
#> 5 MAGRSGDSDATLLQAVKIIKILYQSNPYPKPEGTRQARKNRRRRWRARQRQIRAISERILSDCLGRPAEPVPLQLPPIERLNINCNKSGGTSGTQQPQGNTEGVGSS*
#> 6 MAGRSGDSDATLLQAVKIIKILYQSNPYPKPEGTRQARKNRRRRWRARQRQIRAISERILSDCLGRPAEPVSLQLPPIERLNINCNESGGTSGTQQPQGNTEGVGSP*
#>   Variable
#> 1        A
#> 2        B
#> 3        B
#> 4        C
#> 5        D
#> 6        B

# Note that for consecutive_id() the value changes, everytime the value changes, irrespective of whether it was seen before
# df %>% 
#  mutate(Variable = consecutive_id(Sequence))

创建于 2023-11-16 with reprex v2.0.2

2赞 neilfws 11/17/2023 #2

按序列生成 ID 的一种方法是按序列分组并使用:cur_group_id()

library(dplyr)
df <- df %>% 
  group_by(Sequence) %>% 
  mutate(ID = cur_group_id()) %>%
  ungroup()

结果(向右滚动查看所有 3 列):

# A tibble: 6 × 3
  Name     Sequence                                                                                                        ID
  <chr>    <chr>                                                                                                        <int>
1 KR820422 MAGRSGDSDATLLQAVKIIKILYQSNPYPKPEGTRQARKNRRRRWRARQRQIRAISERILSDCLGRPAEPVPLQLPPIERLNINCNESGGTSGTQQPQGNTKGVGSP*     2
2 KR820423 MAGRSGDSDATLLQAVKIIKILYQSNPYPKPEGTRQARKNRRRRWRARQRQIRAISERILSDCLGRPAEPVSLQLPPIERLNINCNESGGTSGTQQPQGNTEGVGSP*     4
3 KR820424 MAGRSGDSDATLLQAVKIIKILYQSNPYPKPEGTRQARKNRRRRWRARQRQIRAISERILSDCLGRPAEPVSLQLPPIERLNINCNESGGTSGTQQPQGNTEGVGSP*     4
4 KR820425 MAGRSGDSDATLLQAVKIIKILYQSNPYPKPEGTRQARKNRRRRWRARQRQIRAISERILSDCLGRPAEPVSLQLPPIERLNINCNESGGTSGTQQPQGNTEGVGSP*     4
5 KR820426 MAGRSGDSDATLLQAVKIIKILYQSNPYPKPEGTRQARKNRRRRWRARQRQIRAISERILSDCLGRPAEPVPLQLPPIERLNINCNESGGTSGTQQPQGNTEGVGSP*     1
6 KR820427 MAGRSGDSDATLLQAVKIIKILYQSNPYPKPEGTRQARKNRRRRWRARQRQIRAISERILSDCLGRPAEPVPLQLPPIERLNINCNKSGGTSGTQQPQGNTEGVGSS*     3

我想如果你想让 ID 是一个字母,你可以使用 - 无论如何最多 26 个。LETTERS[cur_group_id()]