这个操作归类为去重,那么R语言里面有哪些去重的操作呢?
先创建一个带有重复项的数列
dd <- c(1,3,5,5,5,6,7,7,8,9,9,9,9)
第一个去重的是unique
这是真正意义上的去重,
unique(dd)
[1] 1 3 5 6 7 8 9
他会去掉里面的重复项,保留重复项中的一个,也就是说虽然5是重复了,但是会保留一个5下来
第二个能去重的是duplicated
这个函数比较温和,他返回逻辑值,如果有重复的会返回TRUE
duplicated(dd)
如果要获取非重复项,需要感叹号!
取反才可以
dd[!duplicated(dd)]
[1] 1 3 5 6 7 8 9
第三个去重是dplyr包中的distinct函数
他作用的是数据框,用于筛选行,如果有重复会保留第一个
library(dplyr)
data.frame(dd) %>%
distinct(dd) %>%
pull(dd)
[1] 1 3 5 6 7 8 9
用在这里大材小用了。
他的大用在这里
GEO芯片中多个探针对应一个基因,是求平均值还是保留最大值?
但是现在需求变了,如何去掉所有的重复项
这意味着,只要他是重复的,他本身就不能保留,一个都不可以
这个需求要费点周折,用非重复的数字集合,减去重复的数字集合就可以了
setdiff(unique(dd),dd[duplicated(dd)])
[1] 1 3 6 8
但是真实情况下,我们不这样做,因为太麻烦了,请看例子
现在有个数据
ID那一列有能够对应多个基因的探针,我们需要把它给去掉。
先把这个探针找出来
table(table(data$ID))
1 2
2971 6
有6个探针可以对应两个基因,需要把他们给删掉,实际上,个数少,手工操作也行。
如果我们尝试保留那2971个单一的探针,可以先计数,找出等于1的探针,然后跟原数据merge
取交集就可以了, merge的对象得是数据框。
idlist <- table(data$ID)
id <- data.frame(ID=names(idlist[idlist==1]))
data1 <- merge(data,id,by="ID")
基于以上的想法,如果用dplyr
来做,更加直白一点
library(dplyr)
data2 <- data %>%
count(ID) %>%
filter(n==1) %>%
inner_join(data,by="ID") %>%
select(-n)
最终殊途同归
我是果子,最近腹泻得人都小了一圈,明天见。
网友评论