2012-12-21 77 views
1

我使用的邏輯矩陣來選擇和訂購索引相應的元件的在數值矩陣(均具有相同的尺寸)。例如,矩陣運算:索引的邏輯非對稱向量數值比較

x <- c(FALSE, TRUE, TRUE, FALSE, TRUE, TRUE, FALSE, TRUE, TRUE, FALSE) 
y <- c(7, 10, 3, 1, 6, 8, 2, 11, 1, 5) 

order(y[x],decreasing=TRUE) 
[1] 5 1 4 3 2 6 

# NOTE: these are the **indices** of the ordered vector y[x] now containing 
# only six elements (10,3,6,8,11,1) 

很好。按原樣工作。然而,當我在基質上進行操作,我得到了意想不到的結果:

x <- matrix(rep(c(F,T,T),10), nrow=10) 

     [,1] [,2] [,3] 
    [1,] FALSE TRUE TRUE 
    [2,] TRUE TRUE FALSE 
    [3,] TRUE FALSE TRUE 
    [4,] FALSE TRUE TRUE 
    [5,] TRUE TRUE FALSE 
    [6,] TRUE FALSE TRUE 
    [7,] FALSE TRUE TRUE 
    [8,] TRUE TRUE FALSE 
    [9,] TRUE FALSE TRUE 
[10,] FALSE TRUE TRUE 

y <- matrix(round(rnorm(30,sample(10))), ncol=3) 

     [,1] [,2] [,3] 
    [1,] 7 7 6 
    [2,] 10 12 8 
    [3,] 3 5 6 
    [4,] 1 1 0 
    [5,] 6 5 6 
    [6,] 8 7 7 
    [7,] 2 3 4 
    [8,] 11 8 9 
    [9,] 1 2 1 
[10,] 5 5 5 

    y<-structure(c(7, 10, 3, 1, 6, 8, 2, 11, 1, 5, 7, 12, 5, 1, 5, 7, 
    3, 8, 2, 5, 6, 8, 6, 0, 6, 7, 4, 9, 1, 5), .Dim = c(10L, 3L)) 

order(y[x], decreasing=TRUE) 
[1] 8 5 1 4 12 7 17 3 14 15 10 13 20 18 2 11 6 9 19 16 

似乎作爲比較返回不等長度的矢量(取決於邏輯TRUE中x)的我破壞的預期行爲操作。但是,

y[x] 
[1] 10 3 6 8 11 1 7 12 1 5 3 8 5 6 6 0 7 4 1 5 

產生我期望沒有排序; order(y [x])在所有TRUE元素上執行。這是一個錯誤?我會(天真地)期望它會分別對每列執行操作,並像上面那樣連接結果。

在任何情況下,有進行分區不對稱的結果爲一個矩陣的合理方法?我考慮用NA來填充每個矢量,以最大化dim(x),然後將其綁定到矩陣中(見下文)。看起來像一團糟,因爲我會失去矢量化。任何更優雅的想法/提示?

謝謝。

#Desired result 
    [,1] [,2] [,3] 
[1,] 5 2 4 
[2,] 1 6 1 
[3,] 4 1 2 
[4,] 3 4 7 
[5,] 2 7 5 
[6,] 6 5 6 
[7,] NA 3 3 

回答

1

我不知道爲什麼你想保持與NAs矩陣結構。你不能使用列表清單嗎?在這種情況下,您可以將您的矩陣轉換爲數據框並使用mapply。這就是你如何在R.

my.order <- function(x, y) order(y[x],decreasing=TRUE) 
mapply(my.order, as.data.frame(x), as.data.frame(y)) 

$V1 
[1] 5 1 4 3 2 6 

$V2 
[1] 2 6 1 4 7 5 3 

$V3 
[1] 4 1 2 7 5 6 3 

每列執行功能獨立,您可以隨時墊每個元素和強制列表到數據幀,如果你真的需要。

+0

感謝您對使用列表的建議。我會在一些真實的數據集上進行分析 - 數千萬的大小 - 並報告執行速度。 – user1789784

+0

好的,請告訴我們。我不知道,有秩序向量化版本,如果你擔心性能,你可能需要編寫代碼,循環的編譯語言。您可能需要查看包Rcpp,該包允許在R腳本中編寫和編譯C++代碼。 –

0

y[x]返回

[1] 8 5 1 4 12 7 17 3 14 15 10 13 20 18 2 11 6 9 19 16 

這是一個數值向量。因此

order(y[x])正在研究一種數字向量。它沒有內存yx是矩陣和沒有了解你的心思,它應適用縱列,並曾經是3列的矩陣能力,並且要與NA值填充它。

你可以使用is.na<-,並返回一個列表(類似於我在寫這貼時的回答)

newy <- y 

is.na(newy) <- !x 

申請(newy,2,函數(x)的順序(na.omit(X)遞減= TRUE))

[[1]] 
[1] 5 1 4 3 2 6 

[[2]] 
[1] 2 6 1 4 7 5 3 

[[3]] 
[1] 4 1 2 7 5 6 3 
+0

感謝您提出上述建議。我將給出一些真實的數據集 - 數千萬的大小 - 並報告兩種方法的執行速度。 – user1789784