提问人:Regan Myers 提问时间:11/16/2023 最后编辑:Darren TsaiRegan Myers 更新时间:11/17/2023 访问量:63
删除重复值,需要为 R 中删除的重复项分配唯一变量
Remove duplicate values and need to assign a unique variable to removed duplicates in R
问:
我有一个带有名称的序列数据集,我需要删除我通过使用完成的重复项
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*"
))
答:
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()]
评论
mutate(df, id = LETTERS[consecutive_id(Sequence)])