我正在尝试从每个组的值中减去组均值。
例如:
> 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中做到这一点?
谢谢。
答案 0 :(得分:2)
使用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
答案 1 :(得分:1)
使用库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
答案 2 :(得分: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