2016-01-10 13 views
2

我的任務是生成一個用於計算Z分數然後將其輸出到文件的R代碼。雖然腳本有效,但我對某些令我感到困惑的線路有些疑問。 INPUT.TXT:改進我的R代碼來計算數據框的Z分數

 
GeneID GeneID-2 GeneName TSS-ID Locus-ID Sample1 Sample2 Sample3 Sample4 Sample5 
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 

我想產生Z-分數起始於樣品1的列的端部的數據列。 這裏是我寫將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,]) 
} 
} 

上述腳本成功地生成所述矩陣。有沒有辦法優化它或者這是一個合理的方法?我的巨大數據集有點慢,但它完成了工作。

輸出文件時,我正在移動我的標題。我的目標是將第一列df輸出爲rownames,然後將每個樣本名稱作爲標題。爲此,我使用:

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) 

輸出文件看起來像:

 
Sample1 Sample2 Sample3 Sample4 Sample5 
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方法計算的差異和其他問題中討論的尺度函數之間建議一下?

+0

R中的很多東西都是矢量化的,包括基本的東西,如減法和除法。 – Heroka

+0

那麼?這與此有何關係?感謝您的闡述。 – BioProgram

+1

我錯過了。現在我做了。謝謝@akrun – BioProgram

回答

3

我們可以使用中的rowSds並在一步中完成計算。

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 

還是一個base R唯一方法是

res <- t(scale(t(dfN))) 
attributes(res)[3:4] <- NULL 
+0

工作正常!但是當我輸出Zmatrix =(dfN-rowMeans(dfN))/(rowSds(as.matrix(dfN)))[row(dfN)]時,我仍然將標題移到左邊。另外,我怎樣才能從最初的df中添加剩餘的列。請注意,代碼中的6應該是5來匹配上面的數據。 – BioProgram

+0

@BioProgram這可能是因爲你的數據中有一列是'row.names',我用它作爲第一列。你可以'cbind',即'cbind(df [1:5],res)',其中'res < - (dfN-rowMeans(dfN))..' – akrun

+0

很好學習cbind。但是當我使用它時,我仍然錯過了第一列。 – BioProgram

2

假設你念你的原始數據到一個名爲df數據幀時,在塔基礎包,您可以使用應用函數來得到結果如下所示:

resultMatrix <- apply(df[, 6:10], 1, function(x) (x - mean(x))/sd(x)) 

要將其轉換爲ID列的數據幀你可以做如下:

cbind(df$GeneID, data.frame(t(resultMatrix))) 
+0

雖然這可行,但df $ GeneID的列名不會自動設置。此外,你可以請更多的應用(df [,6:10],1,function(x)(x - mean(x))/ sd(x))?我知道你正在將函數應用到df列,但是函數之前的「1」如何。那個有什麼用途? – BioProgram

+1

您可能希望通過在控制檯中執行「?apply」來全面查找apply函數的幫助頁面。 1說'行明智'。您可以提供2列明智。至於第一列名稱,您可以使用'colnames()'或名稱(輸出)[1] < - 'someName'來更改它。 – Gopala

+0

解釋它!謝謝 – BioProgram

相關問題