在R中为重复序列分配唯一标识并关联至原始数据集
问题描述
现有包含Name和Sequence列的数据集,需要为每个唯一Sequence分配A、B、C这类唯一标识,并将标识映射回原始数据集,最终得到包含Name、Sequence、Variable三列的结果(相同序列对应同一标识)。
原始数据集示例:
Name Sequence 1 KR820422 MAGRSGDSDATLLQAVKIIKILYQSNPYPKPEGTRQARKNRRRRWRARQRQIRAISERILSDCLGRPAEPVPLQLPPIERLNINCNESGGTSGTQQPQGNTKGVGSP* 2 KR820423 MAGRSGDSDATLLQAVKIIKILYQSNPYPKPEGTRQARKNRRRRWRARQRQIRAISERILSDCLGRPAEPVSLQLPPIERLNINCNESGGTSGTQQPQGNTEGVGSP* 3 KR820424 MAGRSGDSDATLLQAVKIIKILYQSNPYPKPEGTRQARKNRRRRWRARQRQIRAISERILSDCLGRPAEPVSLQLPPIERLNINCNESGGTSGTQQPQGNTEGVGSP* 4 KR820425 MAGRSGDSDATLLQAVKIIKILYQSNPYPKPEGTRQARKNRRRRWRARQRQIRAISERILSDCLGRPAEPVSLQLPPIERLNINCNESGGTSGTQQPQGNTEGVGSP* 5 KR820426 MAGRSGDSDATLLQAVKIIKILYQSNPYPKPEGTRQARKNRRRRWRARQRQIRAISERILSDCLGRPAEPVPLQLPPIERLNINCNESGGTSGTQQPQGNTEGVGSP* 6 KR820427 MAGRSGDSDATLLQAVKIIKILYQSNPYPKPEGTRQARKNRRRRWRARQRQIRAISERILSDCLGRPAEPVPLQLPPIERLNINCNKSGGTSGTQQPQGNTEGVGSS*
目标结果示例:
| Name | Sequence | Variable |
|---|---|---|
| KR820422 | 对应序列 | A |
| KR820423 | 对应序列 | B |
| KR820424 | 对应序列 | B |
| ... | ... | ... |
数据集代码:
df <- data.frame( Name = c("KR820422", "KR820423", "KR820424", "KR820425", "KR820426", "KR820427"), Sequence = c( "MAGRSGDSDATLLQAVKIIKILYQSNPYPKPEGTRQARKNRRRRWRARQRQIRAISERILSDCLGRPAEPVPLQLPPIERLNINCNESGGTSGTQQPQGNTKGVGSP*", "MAGRSGDSDATLLQAVKIIKILYQSNPYPKPEGTRQARKNRRRRWRARQRQIRAISERILSDCLGRPAEPVSLQLPPIERLNINCNESGGTSGTQQPQGNTEGVGSP*", "MAGRSGDSDATLLQAVKIIKILYQSNPYPKPEGTRQARKNRRRRWRARQRQIRAISERILSDCLGRPAEPVSLQLPPIERLNINCNESGGTSGTQQPQGNTEGVGSP*", "MAGRSGDSDATLLQAVKIIKILYQSNPYPKPEGTRQARKNRRRRWRARQRQIRAISERILSDCLGRPAEPVSLQLPPIERLNINCNESGGTSGTQQPQGNTEGVGSP*", "MAGRSGDSDATLLQAVKIIKILYQSNPYPKPEGTRQARKNRRRRWRARQRQIRAISERILSDCLGRPAEPVPLQLPPIERLNINCNESGGTSGTQQPQGNTEGVGSP*", "MAGRSGDSDATLLQAVKIIKILYQSNPYPKPEGTRQARKNRRRRWRARQRQIRAISERILSDCLGRPAEPVPLQLPPIERLNINCNKSGGTSGTQQPQGNTEGVGSS*" ))
解决方案
方法一:Base R 实现
利用factor类型的特性,将唯一序列转换为因子后,把因子水平映射为A、B、C这类字母标识:
# 为Sequence列创建因子,自动生成唯一水平 df$Variable <- factor(df$Sequence) # 将因子水平替换为大写字母(A、B、C...) levels(df$Variable) <- LETTERS[1:nlevels(df$Variable)] # 可选:将Variable转为字符类型(若不需要因子格式) df$Variable <- as.character(df$Variable)
执行后查看结果:
print(df)
输出示例:
Name Sequence Variable 1 KR820422 MAGRSGDSDATLLQAVKIIKILYQSNPYPKPEGTRQARKNRRRRWRARQRQIRAISERILSDCLGRPAEPVPLQLPPIERLNINCNESGGTSGTQQPQGNTKGVGSP* A 2 KR820423 MAGRSGDSDATLLQAVKIIKILYQSNPYPKPEGTRQARKNRRRRWRARQRQIRAISERILSDCLGRPAEPVSLQLPPIERLNINCNESGGTSGTQQPQGNTEGVGSP* B 3 KR820424 MAGRSGDSDATLLQAVKIIKILYQSNPYPKPEGTRQARKNRRRRWRARQRQIRAISERILSDCLGRPAEPVSLQLPPIERLNINCNESGGTSGTQQPQGNTEGVGSP* B 4 KR820425 MAGRSGDSDATLLQAVKIIKILYQSNPYPKPEGTRQARKNRRRRWRARQRQIRAISERILSDCLGRPAEPVSLQLPPIERLNINCNESGGTSGTQQPQGNTEGVGSP* B 5 KR820426 MAGRSGDSDATLLQAVKIIKILYQSNPYPKPEGTRQARKNRRRRWRARQRQIRAISERILSDCLGRPAEPVPLQLPPIERLNINCNESGGTSGTQQPQGNTEGVGSP* C 6 KR820427 MAGRSGDSDATLLQAVKIIKILYQSNPYPKPEGTRQARKNRRRRWRARQRQIRAISERILSDCLGRPAEPVPLQLPPIERLNINCNKSGGTSGTQQPQGNTEGVGSS* D
方法二:dplyr 包实现
如果习惯使用tidyverse工具链,可通过分组操作快速分配标识:
首先安装并加载dplyr:
install.packages("dplyr") library(dplyr)
然后执行以下代码:
df <- df %>% group_by(Sequence) %>% mutate(Variable = LETTERS[cur_group_id()]) %>% ungroup()
该方法会直接在原始数据集中添加Variable列,相同Sequence对应同一字母标识。
内容的提问来源于stack exchange,提问作者Regan Myers
相关产品推荐
相关产品推荐

