数据框某一列含多种重复值时,分别重命名的两种方法

处理各种各样的数据总会遇到各种各样的状况,比如:

含相同序列名称的fasta文件用于比对是会报错的,要解决就需要给序列重命名,于是自然而然想到给它们加个12345…

方法1

Jimmy大神的方法:

tmp=do.call(rbind,lapply(split(allppseqs,allppseqs$hgnc_symbol),function(x){
  x$id=1:nrow(x)
  return(x)
}))

然后需要把第2列第3列合并:

method1_out <- tidyr::unite(tmp,"hgnc_symbol",hgnc_symbol,id)

unite 在合并同一数据框中的两列时会自动给数据加上"_"

方法二

就由我来用循环解决它,先生成一个判断重复与否的索引:

index <- duplicated(allppseqs$hgnc_symbol)
head(index)
# [1] FALSE  TRUE FALSE  TRUE  TRUE  TRUE
method2_out <- allppseqs
i <- 1
for(j in 1:nrow(method2_out)){
if(index[j]==FALSE){
  i = 1
  method2_out[j,2] <- paste0(method2_out[j,2], ".",i)
  }
  else {
    i = i+1
    method2_out[j,2] <- paste0(method2_out[j,2], ".",i)
  } 
}

这里需要先创建索引而不直接用 duplicated(allppseqsback2$hgnc_symbol)[j]==FALSE 作为条件,原因是在给某行加上数字 i 后,下一行自然就不再是前一行的重复,会导致每行的duplicated判断值都为 FALSE , 循环运行后 i 永远等于1,给每行加上的数字也一直是1。


最后,向大家隆重推荐生信技能树的一系列干货!

  1. 生信技能树全球公益巡讲:https://mp.weixin.qq.com/s/E9ykuIbc-2Ja9HOY0bn_6g
  2. B站公益74小时生信工程师教学视频合辑:https://mp.weixin.qq.com/s/IyFK7l_WBAiUgqQi8O7Hxw
  3. 招学徒:https://mp.weixin.qq.com/s/KgbilzXnFjbKKunuw7NVfw
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。