【问题标题】:Calculating mean in a dataframe using R programming [duplicate]使用R编程计算数据框中的平均值[重复]
【发布时间】:2017-11-11 21:21:26
【问题描述】:

我是 R 新手,需要一些帮助。我有一个包含不同患者样本的庞大数据框。每位患者有 24 个“铬”。每个“铬”有 3 个段。以下是患者“A2461”的示例。以下是我拥有的一些数据的示例:

     ID chrom loc.start   loc.end num.mark seg.mean seg.sd seg.median seg.mad
1 A2461     1     61735  23342732    13103   0.0314 0.4757     0.0221  0.4811
2 A2461     1  23345569  54962669    17435  -0.0103 0.4807    -0.0292  0.4821
3 A2461     1  54963958  55075062       57   0.4841 0.4070     0.5201  0.3519
1 A2461     2     12784  17248573    13037  -0.0037 0.4643    -0.0053  0.4583
2 A2461     2  17248890  85480817    45819  -0.0331 0.4667    -0.0352  0.4635
3 A2461     2  85481399  89121495     1626   0.0153 0.4727     0.0000  0.4617

我目前使用以下代码获得总平均值:

seg_mean <- df$seg.mean
mean(seg_mean)

但是,我想计算每个染色体的“seg.mean”的平均值,并输出阐明患者 ID 和色度的输出。所以也许像......

ID    chrom    seg.mean
A2461     1     0.1684
A2461     2    -0.0072

任何帮助将不胜感激!感谢阅读。

【问题讨论】:

标签: r dataframe dplyr bioinformatics mean


【解决方案1】:

你可以使用base-R函数:

aggregate(.~ ID + chrom, data=df, mean)

这会给你:

#      ID chrom loc.start  loc.end num.mark     seg.mean    seg.sd seg.median   seg.mad 
# 1 A2461     1  26123754 44460154 10198.33  0.168400000 0.4544667     0.1710 0.4383667 
# 2 A2461     2  34247691 63950295 20160.67 -0.007166667 0.4679000    -0.0135 0.4611667

或者你可以选择只获取seg.mean的平均值:

aggregate(.~ ID + chrom, data=df, mean)[,c("ID", "chrom","seg.mean")]

#      ID chrom     seg.mean 
# 1 A2461     1  0.168400000 
# 2 A2461     2 -0.007166667 

数据

df <- structure(list(ID = c("A2461", "A2461", "A2461", "A2461", "A2461", 
    "A2461"), chrom = c(1L, 1L, 1L, 2L, 2L, 2L), loc.start = c(61735L, 
    23345569L, 54963958L, 12784L, 17248890L, 85481399L), loc.end = c(23342732L, 
    54962669L, 55075062L, 17248573L, 85480817L, 89121495L), num.mark = c(13103L, 
    17435L, 57L, 13037L, 45819L, 1626L), seg.mean = c(0.0314, -0.0103, 
    0.4841, -0.0037, -0.0331, 0.0153), seg.sd = c(0.4757, 0.4807, 
    0.407, 0.4643, 0.4667, 0.4727), seg.median = c(0.0221, -0.0292, 
    0.5201, -0.0053, -0.0352, 0), seg.mad = c(0.4811, 0.4821, 0.3519, 
    0.4583, 0.4635, 0.4617)), .Names = c("ID", "chrom", "loc.start", 
    "loc.end", "num.mark", "seg.mean", "seg.sd", "seg.median", "seg.mad"
    ), row.names = c(NA, -6L), class = "data.frame")

【讨论】:

    【解决方案2】:
    require(dplyr)
    
    seg_mean <- df %>% group_by(ID, chrom) %>% summarise(seg.mean = mean(seg.mean))
    

    【讨论】:

    • 你对如何把它写成一个函数有什么建议吗?我想在不同的患者身上实现这一点,并且可能会创建一个循环,因为我有一个包含 100 多个患者的大型数据集。
    • 您可以将任何内容包装在函数 myfunc &lt;- function(x) {} 中,但我认为以上内容适用于不同的患者:ID。所以我不确定你在寻找什么。
    【解决方案3】:

    只是对Masoud's解决方案稍作修改。

    aggregate(seg.mean~ID+chrom , df , mean)
    

    【讨论】:

      猜你喜欢
      • 2020-10-22
      • 2020-12-16
      • 1970-01-01
      • 2015-11-02
      • 2017-02-16
      • 2014-06-26
      • 1970-01-01
      • 1970-01-01
      • 2018-09-22
      相关资源
      最近更新 更多