如何让distinct根据指定列去重_如果GEO中一个探针对应多个基因,如何把这个探针全部删掉?...

这篇博客探讨了R语言中进行数据去重的不同方法,包括`unique`、`duplicated`和`dplyr::distinct`函数。当需求变为删除所有重复项时,提出了通过计数和交集操作来处理GEO芯片数据中一个探针对应多个基因的情况,以实现完全去重。作者以实例展示了如何实现这一目标,并提醒实际操作中应考虑效率。
摘要由CSDN通过智能技术生成

这个操作归类为去重,那么R语言里面有哪些去重的操作呢?
先创建一个带有重复项的数列

dd 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下来

8a5626d5b241b7549d3f87347b25d79a.gif

第二个能去重的是duplicated

这个函数比较温和,他返回逻辑值,如果有重复的会返回TRUE

duplicated(dd)
db8336ddd838abbb654692e2aae4f68f.gif

如果要获取非重复项,需要感叹号!取反才可以

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芯片中多个探针对应一个基因,是求平均值还是保留最大值?

但是现在需求变了,如何去掉所有的重复项

这意味着,只要他是重复的,他本身就不能保留,一个都不可以

c63b986473c385bddbd5bc261c175ec2.gif

这个需求要费点周折,用非重复的数字集合,减去重复的数字集合就可以了
setdiff(unique(dd),dd[duplicated(dd)])

[1] 1 3 6 8

但是真实情况下,我们不这样做,因为太麻烦了,请看例子
现在有个数据

1ab6e5c998934d5bad7b44e9cc9adbe8.png

ID那一列有能够对应多个基因的探针,我们需要把它给去掉。
先把这个探针找出来
table(table(data$ID))

1    2
2971    6

有6个探针可以对应两个基因,需要把他们给删掉,实际上,个数少,手工操作也行。
如果我们尝试保留那2971个单一的探针,可以先计数,找出等于1的探针,然后跟原数据merge取交集就可以了, merge的对象得是数据框。

idlist data$ID)
id data.frame(ID=names(idlist[idlist==1]))
data1 data,id,by="ID")

基于以上的想法,如果用dplyr来做,更加直白一点

library(dplyr)
data2 data %>% 
  count(ID) %>% 
  filter(n==1) %>% 
  inner_join(data,by="ID") %>% 
  select(-n)

最终殊途同归

ce06e9854c15bd8fb0dabd89dcab9cb5.png

我是果子,最近腹泻得人都小了一圈,明天见。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以的。在使用`distinct()`方法进行去重时,你可以使用Java 8的Lambda表达式来指定你的去重规则。具体方法是使用`distinct()`方法的重载版本,该方法接受一个`Function`类型的参数,这个参数用于指定去重规则。这个`Function`类型的参数应该返回一个可以用于比较元素是否相等的值,相同的元素应该返回相同的值,不同的元素应该返回不同的值。这里提供一段示例代码: ``` List<Person> list = new ArrayList<>(); list.add(new Person("张三", "男", 20)); list.add(new Person("李四", "男", 21)); list.add(new Person("王五", "男", 20)); list.add(new Person("赵六", "女", 22)); list.add(new Person("张三", "男", 20)); List<Person> distinctList = list.stream().distinct().collect(Collectors.toList()); List<Person> distinctList2 = list.stream().distinct(person -> person.getName() + person.getGender() + person.getAge() ).collect(Collectors.toList()); System.out.println("去重前:" + list.size() + " 条数据"); System.out.println("去重后1:" + distinctList.size() + " 条数据"); System.out.println("去重后2:" + distinctList2.size() + " 条数据"); class Person { private String name; private String gender; private int age; public Person(String name, String gender, int age) { this.name = name; this.gender = gender; this.age = age; } public String getName() { return name; } public String getGender() { return gender; } public int getAge() { return age; } } ``` 这段代码,我们定义了一个`Person`类,包含姓、性别和年龄三个属性。我们使用`distinct()`方法对这个包含了多个`Person`对象的List进行去重,我们提供了两种去重方法: 1. 第一种方法直接使用`distinct()`方法进行去重,这种方式会默认使用`Person`对象的`equals()`方法进行比较,由于`Person`类没有重写`equals()`方法,所以默认使用的是Object类的`equals()`方法,因此不会进行去重。 2. 第二种方法使用Lambda表达式指定去重规则,我们使用`Person`对象的姓、性别和年龄三个属性的组合作为去重规则,将这三个属性组成一个字符串,并返回这个字符串。这种方式会根据这个字符串进行去重,最终输出去重前后List数据条数。 你可以根据自己的需要编写不同的去重规则,只需要使用Lambda表达式返回一个可以用于比较元素是否相等的值即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值