2013-07-02 202 views
2

讓你有以下陣列要創建for循環

vec_1 <- c('a','b','c') 
vec_2 <- c('d','e','f') 
vec_3 <- c('g','h','i') 
vec_4 <- c('l','m','n') 

在矩陣X像這樣的一個跨差矩陣:

X <- matrix(c(vec_1, vec_2, vec_3, vec_4), nrow = 3, byrow = FALSE) 

等於

> X 
    [,1] [,2] [,3] [,4] 
[1,] "a" "d" "g" "l" 
[2,] "b" "e" "h" "m" 
[3,] "c" "f" "i" "n" 

我想用一個for()循環得到以下矩陣D

D <- matrix(c('a - d', 'b - e', 'c - f', 
       'a - g', 'b - h', 'c - i', 
       'a - l', 'b - m', 'c - n', 
       'd - g', 'e - h', 'f - i', 
       'd - l', 'e - m', 'f - n', 
       'g - l', 'h - m', 'i - n'), 
      nrow = 3, byrow = FALSE) 

,正如你所看到的,是由每個X柱橫差由:

> D 
    [,1] [,2] [,3] [,4] [,5] [,6] 
[1,] "a - d" "a - g" "a - l" "d - g" "d - l" "g - l" 
[2,] "b - e" "b - h" "b - m" "e - h" "e - m" "h - m" 
[3,] "c - f" "c - i" "c - n" "f - i" "f - n" "i - n" 

在我背後的問題每一個字母是一個數值。

如何可以使用for()循環我實現這個結果?

請用隨機數替換每個字母,當它來回答這個問題是非常有用的,你不需要去瘋狂paste()

+0

你只是試圖讓'膏( 「列」,1:N)'? – Thomas

+1

如果您定義了需要此類解決方案的基礎問題,您可能會得到一個很好的答案。就其本身而言,@Thomas告訴你所有你需要知道的...('膏(「列」,1:(N + 3))') –

+0

我不是,因爲標有'行數「一欄根據我的計算,x「'應該是'N *(N - 1)/ 2'。 –

回答

2

這將這樣的伎倆....

m <- matrix(1:12 , nrow = 3 , byrow = FALSE) 
# [,1] [,2] [,3] [,4] 
#[1,] 1 4 7 10 
#[2,] 2 5 8 11 
#[3,] 3 6 9 12 

t(apply(m , 1 , function(x) { tmp <- t(outer(x,x,"-")) ; tmp[ lower.tri(tmp) ]})) 
# [,1] [,2] [,3] [,4] [,5] [,6] 
#[1,] -3 -6 -9 -3 -6 -3 
#[2,] -3 -6 -9 -3 -6 -3 
#[3,] -3 -6 -9 -3 -6 -3 

必須有更好的方式來做到這一點的負載,但現在我不能想到他們。基本上我們在整個數字矩陣中逐行計算差異值outer。我們轉置(以處理您填充矩陣列的事實),然後從結果中提取下面的三角形。

+0

它可能稍快些,尤其是。 (x){tmp < - outer(x,x,「 - 」); rev(tmp [upper.tri(tmp)])}'。 – Thomas

+0

好東西,考慮'apply()'就像是for()'循環的包裝器,我認爲它完全是主題。 –