用R中每个组的平均值逐组减去值

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

例如:

> x <- data.frame('gene' = c('A','A','B','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中做到这一点?

谢谢。

bsyang1225 回答:用R中每个组的平均值逐组减去值

使用ave()时,您可以使用base R来实现这一目标,在这种情况下,您无需中间应用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
,

使用库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
,

一种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
本文链接:https://www.f2er.com/3068217.html

大家都在问