一个需求,实现去除列表中的多个重复对象。
比如 a,b,c 在列表1 出现,bc 在列表2 出现,ad 在列表3 出现,那么仅仅保留1:abc, 2:空, 3:d。这个列表中的对象可以是数据框,也可以是单个字符,也可以是列表,可以是任何类型的对象。
一个举例场景就是:
- 我有一个列表对象,这个列表对象里还有若干个列表,每个列表里面还有若干个对象,每个对象是一个存放基因名的向量。
- 这些不同的列表是不同的实验,而每个对象对应的是一个样本的富集基因。我希望取出那些独立的不重复的基因集。比如去做后续的PPI网络分析。ps:这个例子只是我随便想的,可能不够严谨。就如同我后面的代码。
思路就是循环列表中的每一个子集中的所有内容,去和之前的所有内容进行比较(%in%
);并且子集本身也是去重的。
代码部分我还加上了数据框的示例:
代码语言:javascript复制set.seed(777)
tmp11 <- lapply(1:10, function(x){
as.data.frame(matrix((sample(1:10,20,replace =T )), ncol = 2))
})
tmp12 <- lapply(1:10, function(x){
n = sample(1:10)
sample(tmp11, n, replace = T)
})
> tmp12[[1]][1]
[[1]]
V1 V2
1 5 7
2 2 5
3 2 1
4 5 5
5 5 9
6 6 6
7 10 2
8 10 9
9 1 3
10 10 5
tmp12 列表由10个列表组成,每个列表内容有若干个数据框。
代码语言:javascript复制tmp13 = vector(mode = "list", length = length(tmp12))
for (i in 1:length(tmp12)){
a1 = tmp12[0:(i-1)]
a1 = unique(unlist(a1, recursive = FALSE))
a2 = unique(tmp12[[i]])
a3 = a2[!a2 %in% a1]
tmp13[[i]] = a3
}
tmp13 就是根据比较去重后的新列表了。
因为这个代码长度的缘故,请实际动手操作一下,体验一下过程。
ps:这个代码感觉还有很大的优化空间。比如提高速率上可以考虑多线程。但其实我觉得还可以考虑用其他的逻辑来优化,你可以把它当做一道编程题哦。