既然熟知apply函数,那么也该了解sweep函数了。相比于apply函数,sweep的操作性虽然没有前者自定义函数运算的灵活,但是在复合计算上相对灵活。
sweep示例
对矩阵test每一行都减去对应行号
> sweep(test,1,c(1,2,3),"-")
[,1] [,2] [,3] [,4]
[1,] 0 1 2 3
[2,] 3 4 5 6
[3,] 6 7 8 9
- 第一个位置test这里需要是矩阵或数据框;
- 第二个位置1和2选一个,原理和apply一样
- 第三个位置是要操作的向量,如果要对行操作,那么这个向量长度就要和行数一样
- 第四个位置是计算符,比如:+ - * / < > 等
sweep标准化
z-score标准化计算公式:(表达量-均值)/方差
# 行为基因,列为样本,现在对基因进行标准化
standardize <- function(x) {
rowmean <- apply(x, 1, mean)
rowsd <- apply(x, 1, sd)
rv <- sweep(x, 1, rowmean,"-") #表达量-均值
rv <- sweep(rv, 1, rowsd, "/") #再除以标准差
return(rv)
}
内置标准化函数为:scale
,该函数要求列为基因,因此处理时根据需要进行转置操作。
参考原文中对apply函数的参数解释的比较详细,可参考。
网友评论