【发布时间】:2011-10-26 08:32:02
【问题描述】:
在 R 中,我有一个包含 9 个命名列的数据框,用于描述实验数据。第一列包含基因名称,接下来的 8 列包含基因表达值。最终目标是按照表达式值的标准差对数据框进行排序。
基本上,我想计算第 2 到 9 列的标准差,并根据这些值对整个数据框进行排序。我该怎么做?
我的第一个想法是添加带有标准偏差的第十列,使用sd() 函数计算,然后对表格进行排序,最后再次删除第十列。但我不知道该怎么做。
【问题讨论】:
在 R 中,我有一个包含 9 个命名列的数据框,用于描述实验数据。第一列包含基因名称,接下来的 8 列包含基因表达值。最终目标是按照表达式值的标准差对数据框进行排序。
基本上,我想计算第 2 到 9 列的标准差,并根据这些值对整个数据框进行排序。我该怎么做?
我的第一个想法是添加带有标准偏差的第十列,使用sd() 函数计算,然后对表格进行排序,最后再次删除第十列。但我不知道该怎么做。
【问题讨论】:
关键命令是:apply、order,以及一些行重排。
##Create some dummy data
##You should always try and include some test data in your questions
R> dd = as.data.frame(matrix(rnorm(80), ncol=8))
R> dd = cbind(GENE = LETTERS[1:10], dd)
R> head(dd, 2)
GENE V1 V2 V3 V4 V5 V6 V7 V8
1 A 1.693 1.2977 1.2220 0.4877 -1.7076 1.7796 0.7980 0.08643
2 B 1.987 0.1545 -0.2173 -0.5959 0.7274 0.2757 -0.5391 0.56054
##Work out the sd for columns 2 to 9 using apply
##Use "order" to reorder the rows
R> dd1 = dd[order(apply(dd[,2:9], 1, sd)),]
##Check the new order
R> apply(dd1[,2:9], 1, sd)
8 7 5 9 2 1 4 6 10 3
0.5197 0.7128 0.8149 0.8210 0.8624 0.8808 0.9804 1.2058 1.5086 1.6191
R> head(dd1, 2)
GENE V1 V2 V3 V4 V5 V6 V7 V8
8 H -0.3869 0.6206 0.279 -0.3867 -0.4915 -1.0979 -0.07696 -0.09097
7 G -1.2966 -1.1279 -1.082 -0.4739 0.2717 -0.1365 0.38614 0.38445
【讨论】:
这是计算列标准差的最快和最短的方法:
colSds = sqrt(diag(cov(data_matrix)))
由于协方差矩阵的对角线由每个变量的方差组成,我们执行以下操作:
cov 计算协方差矩阵
diag提取矩阵的对角线
sqrt 对对角线值求平方根以获得标准差然后您可以使用colSds[column_index] 获取特定列sd。
【讨论】: