昨天差一个帖子,明天补上。
在之前我写过一个帖子
R语言学习路上的忆苦思甜
里面讲的是各种分组计算的方法,最终在我的知识体系里,我觉得
group_by
联合summarise
是分组计算的首选
所以凡是这种需求,我都是这么做的。
先创建一个极其简单的例子。
data <- data.frame(ID=rep(LETTERS,each=3),
sample1=sample(seq(10,1000),78))
第一列重复的字母,三个一组,从A-Z,第二列是对应的数值。
现在的需求是,求每一个字母数值的最大值。
这属于分组计算的需求,应当用group_by
按照ID来分组,用summarise
来计算最大值即可。
library(dplyr)
data1 <- data %>%
group_by(ID) %>%
summarise_all(max)
还可以怎么弄呢,这个方法我在这里见过。
来完成你的生信作业,这是最有诚意的GEO数据库教程
当时我们要对多个探针对应一个基因去重,其实去重有两种思路,一个是求多个探针的平均值,一个是求多个探针的最大值,我们当时选择的是最大值方案,去重用得到是disctinct
函数,这个函数会保留看到的第一个元素,其余重复的都删除。
我们为什么选择最大值方案,完全是从临床医生的角度考虑的,临床上经常出现这种情况:
第一次细针穿刺患者诊断为癌症,治疗后,或者第二次取组织发现没有癌细胞,这时候究竟该如何诊断呢?
答案毫无疑问,应该诊断为阳性。那么到了多个探针对应一个基因的情况,我选择最大值的理有也是类似的,各个探针的区别只是检测效率的差异,如果一个探针能够识别某个基因的表达量为10,那么其他几个都低于10,我们有理有相信,选最大值是靠谱的。
我们只要先把数值按从大到小排序,再去重,就是实现了保留最大值。
library(dplyr)
data2 <- data %>%
arrange(desc(sample1)) %>%
distinct(ID,.keep_all = T) %>%
arrange(ID)
我们发现两种方法,结果是一样的。
假如有人还是觉得取平均值靠谱呢?比如,一个基因的甲基化水平,大家喜欢用多个甲基化位点的平均值来表示。那么group_by
也是可以的,只要把max改成mean就可以了。
library(dplyr)
data3 <- data %>%
group_by(ID) %>%
summarise_all(mean)
我们嘴上说的是summarise
,为什么用的却是summarise_all
, 因为summarise
只能作用于一列,而summarise_all
可以作用于分组的其他所有列,这个更符合实际情况。
比如:
data4 <- data.frame(ID=rep(LETTERS,each=3),
sample1=sample(seq(10,1000),78),
sample2=sample(seq(20,800),78),
sample3=sample(seq(50,600),78))
这个代码可同时处理所有列
library(dplyr)
data4 <- data4 %>%
group_by(ID) %>%
summarise_all(mean)
是不是很厉害呢?
今天的数据完全由代码产生,每个人都可以操作,但是要注意,因为产生的是随机数,所以结果不会跟我一样。
我是果子,明天见,明天有三个帖子。
网友评论