2015-10-06 142 views
0

本质上,我试图做一系列的y轴上的log2倍数变化和y轴上的平均数(观察结果是基因)。这些通常被称为MA图。我遇到的问题是将我的数据转化为正确的形式。我可以通过一个循环做到这一点,但想知道正确的做法。R dplyr如何总结

在这一点上,我有两个数据框:我的设计矩阵和我的数据矩阵。设计矩阵看起来像这样(称之为ED_df):

SampleID  Patient Grade Batch 
MD48L_2_B_L1 MD48 G2 Feb15 
MD48R_3_B_L1 MD48 G3 Feb15 
MD53L_2_B_L1 MD53 G2 Feb15 
MD53R_3_B_L1 MD53 G3 Feb15 
MD58L_2_B_L1 MD58 G2 Sep15 
MD58R_3_B_L1 MD58 G3 Sep15 

dim(ED_df) 
# [1] 18 6 

每行是一个独特的样本。每个样本来自患者+等级+批次。在这种情况下,所有患者都在成绩(G2或G3)附近配对。总共有3个批次。两个患者横过间歇1和2或批次2和3

我的数据矩阵看起来像这样(称之为data_df)复制:

 Gene   MD48L_2_B_L1 MD48R_3_B_L1 MD53L_2_B_L1 MD53R_3_B_L1 MD58L_2_B_L1 
1 ENSG00000000003 364.26079 329.28730 531.52188 371.67413 275.745038 
2 ENSG00000000005  18.92264  49.89201  42.18428  19.42548  1.948728 
3 ENSG00000000419 270.59373 261.65590 284.74386 414.41018 293.283591 
4 ENSG00000000457 145.70432 125.28439 122.33440 129.50318 148.103342 

dim(data_df) 
# [1] 31707 18 

每列对应于一个独特的样品。

我想要做的是对于每个基因,在每个患者批次集内获得log2倍数变化(G3/G2)。另外,我希望为每个患者批处理组获得平均值(G3,G2)。

然后我会把它绘制成一个MA图。

再一次,我可以看到如何通过嵌套for循环痛苦地做到这一点,我想要做的是弄清楚如何通过某种聚合函数做到这一点。

+0

整理数据!使用'tidyr :: gather'将您的数据矩阵转换为一个数据框,其中包含'Gene','SampleID'和'Value'列,然后加入到'ED_df'中以获得成绩,批次和患者列。 – Gregor

+0

谢谢。我认为你所说的是以长格式将因子信息作为附加列,是正确的吗?在这种格式下,基因也是我想的一个因素。此时,您可以使用FUN = sum或/?做一次总计价值〜基因+患者+批+ +分级。 –

回答

1

另外两个步骤:涂抹等级让G2和G3最终在不同的栏目中进行总结。我不确定我是否完全理解了你想要的聚合过程,但我已经采取了一个措施。我包括gm(几何平均)函数的心理包。处理比率数据时这很重要。

library(dplyr) 
library(tidyr) 
library(psych) 

data_df %>% 
    as.data.frame %>% 
    gather(sample, measurement, -gene) %>% 
    left_join(ED_df) %>% 
    spread(Grade, measurement) %>% 
    group_by(Patient, Batch) %>% 
    summarize(G2_geometric_mean = G2 %>% gm, 
      G3_geometric_mean = G3 %>% gm) %>% 
    mutate(geometric_mean_ratio = G3_geometric_mean/G2_geometric_mean) 
+0

嗨,谢谢。我认为这就是我正在寻找的。消化它会花一点时间。以下是我以非R-ish方式完成的工作:tidy_df <-gather(tidy_df,gene) colnames(tidy_df)< - c(“gene”,“SampleName”,“value”) tidy_df < - 合并(tidy_df,slim_expt_1 [,c(1:3,5)],by =“SampleName”,all.x = T) temp_mean <-aggregate(value_gene + Patient + Batch,tidy_df,FUN = mean) temp_log2FC <-log2(temp [temp $ Grade ==“G3”,3]/temp [temp(temp)] <-tidy_df [order(tidy_df $ gene,tidy_df $ Patient,tidy_df $ Grade,tidy_df $ Batch),] $ Grade ==“G2”,3]) temp_mean $ log2FC <-temp_log2FC –

+0

我似乎无法在评论模式中添加回车。我讨厌我的解决方案B/C它假定事情是有序的,配对很好等,所以我会在我学习推理决赛后给你解决方案。 = / –