72-R编程12-删除列表的成员对象中的重复内容

2021-12-17 09:13:16 浏览数 (1)

一个需求,实现去除列表中的多个重复对象。

比如 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:这个代码感觉还有很大的优化空间。比如提高速率上可以考虑多线程。但其实我觉得还可以考虑用其他的逻辑来优化,你可以把它当做一道编程题哦。

ps

0 人点赞