【问题标题】:normalize all data to single gene (observation) in r将所有数据标准化为 r 中的单个基因(观察)
【发布时间】:2015-02-05 00:19:20
【问题描述】:

我有一些来自 850 种蛋白质的蛋白质表达数据,我想将这些数据标准化为参考蛋白质。这是纠正技术错误的好方法。我是 R 新手,刚刚想出一个整洁的数据集。但是当我搜索规范化时 - 它主要是缩放数据。我找不到与数据集中的数据点进行比率的好方法。所以我有以下内容,其中 type=D 或 T,pt.num=1-8,并且在 612.9 kb 文件中有 859 个 GeneID 和 9952 个元素。

> head(df10g)
  GeneID type pt.num   value
1    A2M    D      1  8876.5
2   ABL1    D      1  2120.8
3   ACP1    D      1  1266.6
4   ACP5    D      1 67797.6
5 ACVRL1    D      1   650.1
6   ACY1    D      1  6264.8
318 IGF2R    D      1   6294.8

我想将每个 pt.num.type 标准化为 IGF2R。但我不太清楚它的语义。我想要这种类型的功能

Norm.ig2Fr=GeneID.type.pt.num(value)/IG2FR.type.pt.num(value)

Norm.ig2fr=ASM.D.1 (value)/IG2FR.D.1 (value)

Norm.ig2fr=8876.5/6294.8

想要的输出是

GeneID type pt.num   value              Norm.ig2fr      log2Norm.ig2fr
    1    A2M    D      1  8876.5        1.41            0.49
    2   ABL1    D      1  2120.8
    3   ACP1    D      1  1266.6
    4   ACP5    D      1 67797.6

我想我可以使用 mutate 或 ddply 转换,但我缺少一些东西来将比率的分母固定为相同的 GeneID 值,但改变 pt.num 和类型。

df11 <- ddply(df10g, .(pt.num), transform, Norm.ig2b=value/IGF2R)

df10.igf2r<- mutate(df10t, .(type, pt.num), Norm.ig2fr=value/IG2FR)

dput(df10g)
structure(list(GeneID = structure(c(1L, 2L, 3L, 4L, 6L, 7L), .Label = c("A2M", 
"ABL1", "ACP1", "ACP5", "Activated Protein C", "ACVRL1", "ACY1"),class = "factor"), type = c("D", "D", "D", "D", "D", 
"D"), pt.num = c("1", "1", "1", "1", "1", "1"), value = c(8876.5, 
2120.8, 1266.6, 67797.6, 650.1, 6264.8)), .Names = c("GeneID", 
"type", "pt.num", "value"), row.names = c(NA, 6L), class = "data.frame")

任何建议或见解将不胜感激。感谢您的帮助!

【问题讨论】:

    标签: r normalization plyr


    【解决方案1】:

    我想这可能就是你的意思。我想不出plyr 的解决方案。但是,我想向dplyr 提出建议。我在这里创建了一个示例数据来演示代码。我认为您想使用group_by()typept.num 进行分组。然后,您想在mutate() 中进行标准化。 value[GeneID == "IGF2R"] 指定每个组中IGF2R 的值。例如,对于 D-1 组,value[GeneID == "IGF2R"] 是 1281.000,对于 T-1 组,value[GeneID == "IGF2R"] 是 1561.364。使用这些值,R 对每个组进行归一化。

    set.seed(111)
    mydf <- data.frame(GeneID = rep(c("A2M", "ABL1", "ACP1", "ACP5",
                                      "ACVRL1", "ACY1", "IGF2R"), times = 2),
                       type = rep(c("D", "T"), each = 7),
                       pt.num = 1,
                       value = runif(14, 1200, 8800),
                       stringsAsFactors = FALSE)
    
    #   GeneID type pt.num    value
    #1     A2M    D      1 5706.658
    #2    ABL1    D      1 6721.257
    #3    ACP1    D      1 4015.207
    #4    ACP5    D      1 5113.421
    #5  ACVRL1    D      1 4070.240
    #6    ACY1    D      1 4379.364
    #7   IGF2R    D      1 1281.000
    #8     A2M    T      1 5245.444
    #9    ABL1    T      1 4484.421
    #10   ACP1    T      1 1911.980
    #11   ACP5    T      1 5423.927
    #12 ACVRL1    T      1 5685.737
    #13   ACY1    T      1 1710.273
    #14  IGF2R    T      1 1561.364
    
    library(dplyr)             
    group_by(mydf, type, pt.num) %>%
    mutate(out = value / value[GeneID == "IGF2R"])
    
    
    #   GeneID type pt.num    value      out
    #1     A2M    D      1 5706.658 4.454847
    #2    ABL1    D      1 6721.257 5.246884
    #3    ACP1    D      1 4015.207 3.134433
    #4    ACP5    D      1 5113.421 3.991743
    #5  ACVRL1    D      1 4070.240 3.177394
    #6    ACY1    D      1 4379.364 3.418708
    #7   IGF2R    D      1 1281.000 1.000000
    #8     A2M    T      1 5245.444 3.359527
    #9    ABL1    T      1 4484.421 2.872118
    #10   ACP1    T      1 1911.980 1.224557
    #11   ACP5    T      1 5423.927 3.473840
    #12 ACVRL1    T      1 5685.737 3.641520
    #13   ACY1    T      1 1710.273 1.095371
    #14  IGF2R    T      1 1561.364 1.000000
    

    data.table中应用同样的程序,下面的代码也可以工作。

    library(data.table)
    foo <- setDT(mydf)[, out := value / value[GeneID == "IGF2R"], by = list(type, pt.num)]
    print(foo)
    
     #   GeneID type pt.num    value      out
     #1:    A2M    D      1 5706.658 4.454847
     #2:   ABL1    D      1 6721.257 5.246884
     #3:   ACP1    D      1 4015.207 3.134433
     #4:   ACP5    D      1 5113.421 3.991743
     #5: ACVRL1    D      1 4070.240 3.177394
     #6:   ACY1    D      1 4379.364 3.418708
     #7:  IGF2R    D      1 1281.000 1.000000
     #8:    A2M    T      1 5245.444 3.359527
     #9:   ABL1    T      1 4484.421 2.872118
    #10:   ACP1    T      1 1911.980 1.224557
    #11:   ACP5    T      1 5423.927 3.473840
    #12: ACVRL1    T      1 5685.737 3.641520
    #13:   ACY1    T      1 1710.273 1.095371
    #14:  IGF2R    T      1 1561.364 1.000000
    

    【讨论】:

    • 这个解决方案很棒。做我一直在寻找的。感谢您的帮助!
    • @New_to_R 很高兴。我很高兴听到这对您有所帮助。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-07
    相关资源
    最近更新 更多