【问题标题】:Subtracting values group-wise by the average of each group in RR中每组的平均值减去分组值
【发布时间】:2019-11-20 06:42:25
【问题描述】:

我正在尝试从每个组的值中减去组均值。

例如:

> x <- data.frame('gene' = c('A','A','A','B','B','C','C','C'),'value' = c(32.3,31,30.5,25,22.1,20.5,21.2,19.8))
> x
  gene value
1    A  32.3
2    A  31.0
3    A  30.5
4    B  25.0
5    B  22.1
6    C  20.5
7    C  21.2
8    C  19.8

我可以找到组的意思:

> aggregate(x[,2],list(x$gene),mean)
  Group.1        x
1       A 31.26667
2       B 23.55000
3       C 20.50000

如何用相应组的平均值减去 x 中的“值”?我想要的结果如下:

   gene value-group.mean
1    A  1.03333
2    A  -0.26667
3    A  -0.76667
4    B  1.45
5    B  -1.45
6    C  0
7    C  0.7
8    C  -0.7

如何在 R 中做到这一点?

谢谢。

【问题讨论】:

    标签: r aggregate


    【解决方案1】:

    data.table 方法:

    require(data.table)
    
    setDT(x)[, `value-group.mean` := mean(value), by = gene][, `value-group.mean` := value - `value-group.mean`]
    
    x
    #   gene value value-group.mean
    # 1:    A  32.3        1.0333333
    # 2:    A  31.0       -0.2666667
    # 3:    A  30.5       -0.7666667
    # 4:    B  25.0        1.4500000
    # 5:    B  22.1       -1.4500000
    # 6:    C  20.5        0.0000000
    # 7:    C  21.2        0.7000000
    # 8:    C  19.8       -0.7000000
    

    【讨论】:

      【解决方案2】:

      在使用base R 时,您可以使用ave() 来实现它,在这种情况下,您不需要在中间应用aggregate

      x$value_group.mean <- with(x,value-ave(value,gene))
      

      这样

      > x
        gene value value_group.mean
      1    A  32.3        1.0333333
      2    A  31.0       -0.2666667
      3    A  30.5       -0.7666667
      4    B  25.0        1.4500000
      5    B  22.1       -1.4500000
      6    C  20.5        0.0000000
      7    C  21.2        0.7000000
      8    C  19.8       -0.7000000
      

      【讨论】:

        【解决方案3】:

        使用库dplyr,您可以:

        library(dplyr)
        x %>%
          group_by(gene) %>%
          mutate_all(funs(.-mean(.)))
        
        # A tibble: 8 x 2
        # Groups:   gene [3]
          gene   value
          <fct>  <dbl>
        1 A      1.03 
        2 A     -0.267
        3 A     -0.767
        4 B      1.45 
        5 B     -1.45 
        6 C      0    
        7 C      0.700
        8 C     -0.700
        

        【讨论】:

        • %>% 是什么意思?谢谢。
        • 它被称为pipe,您可以在magrittr 包中找到更多定义。简而言之,它允许传递连续的操作而不回调先前的对象。例如x %&gt;% headhead(x) 相同
        【解决方案4】:

        通过添加merge的使用修改Khaynes答案以分离聚合和减法。

        x <- data.table(gene = c('A','A','A','B','B','C','C','C'), value = c(32.3,31,30.5,25,22.1,20.5,21.2,19.8) )
        x_gene_mean <- x[,.(group_mean=mean(value)),keyby=gene]
        
        x_2=special_function(x)#Perform any needed operation against x to obtain x_2
        
        x_2 <- merge(x,x_gene_mean,by="gene")
        x_2[, anomaly := value - group_mean]
        

        为什么分开很重要:

        1. x 是原始数据。这可以参考长期数据。
        2. x_gene_mean 是组平均值。这可以称为气候学。
        3. x 进行分析,例如,根据幅度、值和比率的阈值在​​ x 中查找极端事件。 x_2 现在是 x 中发现的极端事件。 x_2 也是 x 的一小部分。这可以称为长期数据中的选定/极端事件。
        4. 要计算 x_2 的异常值,您需要用 x(不是 x_2)的组均值减去 x_2,即 x_gene_mean。这可以称为长期数据中与气候学相关的选定/极端事件的异常。

        这是地球科学中的常规方法。要找到选定案例的异常,必须将其与原始长期数据中的气候学相减。

        【讨论】:

          猜你喜欢
          • 2019-03-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-05-18
          相关资源
          最近更新 更多