如何将数据框中每行数值除以对应分组的标准差?
按分组标准差标准化每行数值的方法
没问题,我来帮你实现把每行数值除以对应分组标准差的需求!先回顾下你的原始数据:
g1 = data.frame ( gene = c( "a","a","a","a","b","b"), value = c(1,200,3,5,0,3) )
你已经用ddply()生成了分组的描述统计,现在要给每行数据添加一个新列,让每个value除以对应gene组的标准差,有两种简单的方法可以实现:
方法1:用你熟悉的plyr包实现
直接用ddply()结合transform(),就能在原数据基础上生成新的标准化列:
library(plyr) g1_scaled <- ddply(g1, "gene", transform, value_scaled = value / sd(value))
运行后得到的结果如下:
gene value value_scaled
1 a 1 0.01015089
2 a 200 2.03017807
3 a 3 0.03045268
4 a 5 0.05075446
5 b 0 0.00000000
6 b 3 1.41421356
你看,第一行的1/98.51354就得到了≈0.01015的结果,完全符合你的预期。
方法2:用更主流的dplyr包实现
如果之后想尝试更现代的R数据处理工具,推荐用tidyverse生态里的dplyr,代码可读性更强:
library(dplyr) g1_scaled <- g1 %>% group_by(gene) %>% mutate(value_scaled = value / sd(value)) %>% ungroup()
这个方法的输出和上面完全一致,group_by(gene)按基因分组,mutate()负责添加新列并计算标准化值。
额外提示:处理标准差为0的情况
如果你的数据里存在某个分组所有数值都相同的情况,那这个组的标准差会是0,直接除以0会得到Inf或者NaN,可以加个判断逻辑避免这个问题:
# dplyr版本的容错处理 g1_scaled <- g1 %>% group_by(gene) %>% mutate(value_scaled = ifelse(sd(value) == 0, value, value / sd(value))) %>% ungroup()
内容的提问来源于stack exchange,提问作者Ahdee
相关产品推荐
相关产品推荐

