前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >72-R编程12-删除列表的成员对象中的重复内容

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

作者头像
北野茶缸子
发布2021-12-17 09:13:16
2.7K0
发布2021-12-17 09:13:16
举报
文章被收录于专栏:北野茶缸子的专栏

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

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-12-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 北野茶缸子 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档