重复,特别是针对一些样本名称的重复问题的处理,是我在进行生信分析时经常遇到的。一种常见的解决策略是先找到重复之处,然后去重。但如果我们想要保留全部的重复ID呢?
生成一个非常简单的带重复的序列:
r$> data = c("a", "b", "c", "d", "a")
r$> data
[1] "a" "b" "c" "d" "a"
这里a
重复了,如果我们去重,可能会选择2种办法。
r$> unique(data)
[1] "a" "b" "c" "d"
# 或者
r$> data[!duplicated(data)]
[1] "a" "b" "c" "d"
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添加标记,可以是前缀或者后缀,这样既能视觉上识别,也能够通过编程的手段识别或者后续对前后缀裁剪。后缀才容易操作,更为推荐。
首先介绍第一种方法:
r$> ave(data, data, FUN = function(i) paste0(i, '_', seq_along(i)))
[1] "a_1" "b_1" "c_1" "d_1" "a_2"
此处先对同名ID进行分组,然后利用函数分别添加数字后缀。
如果我们仅想要标记出第二次及以后出现的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"
我用了4年多R都不知道这个函数~只是你想不到,所以你没找到。。。
参考:https://stackoverflow.com/questions/48825010/add-specific-characters-to-duplicated-strings[1]
[1]
https://stackoverflow.com/questions/48825010/add-specific-characters-to-duplicated-strings: https://stackoverflow.com/questions/48825010/add-specific-characters-to-duplicated-strings