R语言-几种处理重复ID的方法

一、 概述

重复,特别是针对一些样本名称的重复问题的处理,是我在进行生信分析时经常遇到的。一种常见的解决策略是先找到重复之处,然后去重。但如果我们想要保留全部的重复ID呢?

一个简单的例子
生成一个非常简单的带重复的序列:

r$> data = c("a", "b", "c", "d", "a")                                                                                   

r$> data                                                                                                                
[1] "a" "b" "c" "d" "a"

这里a 重复了。

二、去重

通常采用的两种方法,如下:

1. 保留唯一值

r$> unique(data)                                                                                                        
[1] "a" "b" "c" "d"
# 或者
r$> data[!duplicated(data)]                                                                                             
[1] "a" "b" "c" "d"

2. 完全去重

r$> tb = table(data)                                                                                                    
r$> tb[tb > 1]                                                                                                          
a 
2 
r$> data[!data %in% names(tb[tb > 1])]                                                                                  
[1] "b" "c" "d"

三、如何保留信息又能看出重复

去重意味着数据的丢失,这种丢失在实际工作中有可能不能容忍。虽然是同样的ID,但它有可能关联多种可能的事件。例如,一个肿瘤患者,它可以有肿瘤和正常两种组织的样本,这可能写在不同的行。亦或者肿瘤样本有不同的位置来源的信息等等,但共用一个样本ID。

解决的思路是对重复ID添加标记,可以是前缀或者后缀,这样既能视觉上识别,也能够通过编程的手段识别或者后续对前后缀裁剪。后缀才容易操作,更为推荐

下面我们来引入两种方法:

1. ave()函数

r$> ave(data, data, FUN = function(i) paste0(i, '_', seq_along(i)))                                                     
[1] "a_1" "b_1" "c_1" "d_1" "a_2"
  • 此处先对同名ID进行分组,然后利用函数分别添加数字后缀。

2. make.unique()函数

仅标记出第二次及以后出现的ID,这样能保留大部分的数据不做改动。

R自带了make.unique()解决这个问题!

r$> make.unique(data)                                                                                                   
[1] "a"   "b"   "c"   "d"   "a.1"

r$> make.unique(data, sep = "_")                                                                                        
[1] "a"   "b"   "c"   "d"   "a_1"

Guess you like

Origin blog.csdn.net/nixiang_888/article/details/119349617