Bio*_*ram 5 optimization loops r
我的任务是生成用于计算 Z 分数的 R 代码,然后将其输出到文件。虽然脚本有效,但我对一些令我困惑的台词有一些疑问。输入.txt:
基因 ID GeneID-2 基因名称 TSS-ID 基因座 ID 样本 1 样本 2 样本 3 样本 4 样本 5 ID1 X1 Zranb2 TSS1 Loc1 22.49161667 14.7231 19.62885833 26.16171667 39.3109 ID2 X2 Lphn2 TSS2 Loc2 6.439735 5.920786667 8.883331667 7.696353333 10.46969333 ID3 X3 Rpf1 TSS3 Loc3 30.67975 20.93751667 27.30251667 31.55653333 58.57418333 ID4 X4 Ctbs TSS4 Loc4 1.916071667 1.943611667 2.696701667 3.130295 2.74012 ID5 X5 Spata1 TSS5 Loc5 0.715265667 0.3318745 0.4183155 0.961065833 1.10731 ID6 X6 Sap30bp TSS6 Loc6 21.65946667 23.84386667 28.39683333 25.32866667 26.96016667 ID7 X7 Recql5 TSS7 Loc7 7.541321667 4.674345 4.40599 3.24996 3.327395 ID8 X8 Itgb4 TSS8 Loc8 37.3442 51.58868333 51.58868333 44.84458333 42.44406667
我想为从样本 1 开始到列末尾的数据列生成 Z 分数。这是我写的 R 代码:
df <- read.table("Input.txt", row.names=1, header=TRUE, sep="\t", na.strings="NA")
x<-df[,5:ncol(df)] #selects the columns after column 5, so just the data
p<-matrix(0, now(x), ncol(x)) #opens matrix. First issue: I used "0" as I saw other people on forums doing that, but i dont know its significance.It worked for me, so i kept it. Can anyone comment on this?
#Create a loop for row and columns
for (i in 1:nrow(x)) {
for (j in 1:ncol(x)) {
p[i,j] <- (x[i,j]-rowMeans(x[i,]))/sd(x[i,])
}
}
Run Code Online (Sandbox Code Playgroud)
上述脚本成功生成了矩阵。有没有办法优化它或者这是一个合理的方法吗?对于我的庞大数据集来说,它有点慢,但它可以完成工作。
输出文件时,我的标题发生了变化。我的目标是将 df 的第一列输出为行名,然后将每个样本名称输出为标题。为此,我使用了:
rownames(p) <-rownames(df)
colnames(p) <- colnames(df[,5:ncol(df)])
write.table(p, file = "Zscore.txt", append = FALSE, quote = FALSE, sep = "\t", row.names = TRUE, col.names = TRUE)
Run Code Online (Sandbox Code Playgroud)
输出文件如下所示:
样品1 样品2 样品3 样品4 样品5 ID1 -0.212153637 -1.048074183 -0.520196808 0.182762424 1.597662204 ID2 -0.780453984 -1.061276795 0.541869723 -0.100449696 1.400310753 ID3 -0.216506298 -0.890314297 -0.450087937 -0.1558648 1.712773332 ID4 -1.064932662 -1.013415279 0.395343854 1.206440228 0.476563859 ID5 0.02537058 -1.119050742 -0.861024653 0.759083238 1.195621576 ID6 -1.35974252 -0.52968526 1.200411349 0.03452872 0.654487711
标题向左移动。另外,如果我想在输出文件中包含 df 的所有前 5 列,该怎么做?
最后,请问我上面的Zscore方法计算和其他问题中讨论的尺度函数有什么区别吗?
我们可以使用rowSds
frommatrixStats
并一步完成计算。
library(matrixStats)
dfN <- df[6:ncol(df)]
(dfN-rowMeans(dfN))/(rowSds(as.matrix(dfN)))[row(dfN)]
# Sample1 Sample2 Sample3 Sample4 Sample5
#1 -0.21215364 -1.04807418 -0.5201968 0.18276242 1.5976622
#2 -0.78045398 -1.06127680 0.5418697 -0.10044970 1.4003108
#3 -0.21650630 -0.89031430 -0.4500879 -0.15586480 1.7127733
#4 -1.06493266 -1.01341528 0.3953439 1.20644023 0.4765639
#5 0.02537058 -1.11905074 -0.8610247 0.75908324 1.1956216
#6 -1.35974252 -0.52968526 1.2004113 0.03452872 0.6544877
#7 1.66627789 0.01983708 -0.1342732 -0.79815548 -0.7536863
#8 -1.34013679 0.98280311 0.9828031 -0.11700084 -0.5084686
Run Code Online (Sandbox Code Playgroud)
或者base R
唯一的方法是
res <- t(scale(t(dfN)))
attributes(res)[3:4] <- NULL
Run Code Online (Sandbox Code Playgroud)