2014-03-06 73 views
2

這可能是非常簡單的實現,但讓我難倒了。如何根據R中原始數據的索引對數據幀的列進行排序?

我有一個數據幀:

chip1 chip2 
P1 1.57 2.13 
P2 2.04 1.92 
P3 1.90 2.11 
P4 1.48 2.24 

爲位數標準化的下一步是進行排序每一列,然後生成該行明智平均值,如下所示:

chip1 chip2  M 
P1 1.48 1.92 1.700 
P2 1.57 2.11 1.840 
P3 1.90 2.13 2.015 
P4 2.04 2.24 2.140 

然後最終歸一化數據爲:

 chip1 chip2 
    P1 1.840 2.015 
    P2 2.140 1.700 
    P3 2.015 1.840 
    P4 1.700 2.140 

歸一化數據是使用pr的M列生成的從第一個數據幀開始基於芯片1和芯片2重新排序數據幀。我如何使用原始列中的索引來訂購M列?我有點迷路了?

謝謝。

+0

看起來像您的第一數據幀是在相同的順序,第二? – BrodieG

+0

我的不好:)。我一定是錯誤地複製了另一個。我很抱歉沒有重新檢查我的帖子。它已更新。謝謝@BrodieG – user1828605

回答

2
nrm <- rowMeans(sapply(df, sort)) 
sapply(df, function(x) nrm[rank(x)]) 

生產:

 chip1 chip2 
[1,] 1.840 2.015 
[2,] 2.140 1.700 
[3,] 2.015 1.840 
[4,] 1.700 2.140 
+0

這正是我想要的。非常感謝。你真棒!!! – user1828605

+0

如果我想要挑剔,我還建議'data.frame(lapply(df,function(x)nrm [rank(x)]))'因此對矩陣的強制不會發生。 – thelatemail

+0

@thelatemail,但你永遠不想挑剔,你會);)。順便說一句,'df'顯然也是一個基礎/統計功能。這會讓你發瘋嗎?我覺得我太習慣將它當作一個變量名來停止。 – BrodieG

1

根據你提到的內容,我希望這是你的意思。

> X = cbind(rnorm(5, 1), rnorm(5,0)) 
> X 
      [,1]   [,2] 
[1,] 2.2629543 -1.539950042 
[2,] 0.6737666 -0.928567035 
[3,] 2.3297993 -0.294720447 
[4,] 2.2724293 -0.005767173 
[5,] 1.4146414 2.404653389 
> Y = apply(X,2,sort) 
> cbind(Y, rowSums(Y)) 
      [,1]   [,2]  [,3] 
[1,] 0.6737666 -1.539950042 -0.8661834 
[2,] 1.4146414 -0.928567035 0.4860744 
[3,] 2.2629543 -0.294720447 1.9682338 
[4,] 2.2724293 -0.005767173 2.2666621 
[5,] 2.3297993 2.404653389 4.7344527 
> X[order(rowSums(Y)),] 
      [,1]   [,2] 
[1,] 2.2629543 -1.539950042 
[2,] 0.6737666 -0.928567035 
[3,] 2.3297993 -0.294720447 
[4,] 2.2724293 -0.005767173 
[5,] 1.4146414 2.404653389 
+0

感謝您的回覆,但這不是我要找的。這是Quantile Normalization的算法。 給定n個向量,長度爲p,形式爲X,維數爲p×n,其中每個 數組是一列。 分別對X的每一列進行排序以給出X. 取X中的行的平均值,並創建X,它是一個與X的維度相同的數組,但每行中的所有值都等於X的行平均值。 通過重新排列X的每一列來獲得Xn,使其與對應的輸入向量具有相同的排序。 – user1828605

相關問題