2017-12-30 28 views
-1

行列の2つの要素をすべて順番に抽出し、その結果を行列として返して、計算式の答えを返す方法:ユークリッド距離を計算するために、rの行列行の2つの要素を順番に抽出する

例えば

、Iは6列の1つの行行列有する:私は上に第2の反復の列と第1の反復における2つ、3及び4を抽出したい

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

を。結果はマトリックスの形でなければなりません。

[1,] 2 1  
[2,] 5 5 
[3,] 10 1 

私のオリジナルコード:

 data <- matrix(c(1,1,1,2,2,1,2,2,5,5,5,6,10,1,10,2,11,1,11,2), ncol = 2) 

センターマトリックス:

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

    objCentroidDist <- function(data, centers) { 
     resultMatrix <- matrix(NA, nrow=dim(data)[1], ncol=dim(centers)[1]) 
     for(i in 1:nrow(centers)) { 
      resultMatrix [,i] <- sqrt(rowSums(t(t(data)-centers[i, ])^2)) 
     } 
      resultMatrix 
    } 

    objCentroidDist(data,centers) 

私は結果の行列は、以下の通りになりたい:

 [1,][,2][,3] 

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

私の関心は、ありますデータセンターの距離を計算する方法データ行列のnsは2であり、中心行列は6である。 (データ行列からの距離と中心行列の2列ごとの距離を計算する)。中心行列の各行は3つの中心を有する。

+0

あなたの問題が神秘的な例外であるのか、言葉の言葉(または間にあるもの)を知ることができないのか分からないので、「助けが必要です」という質問はありません。 *あなたが必要とするものを正確に*指定するためにあなたの質問を編集してください。 –

+0

行列の場合、 'matrix(mat、ncol = 2、byrow = TRUE)'です。リストの場合、 'split(mat、rep(seq(length(mat)/ 2)、each = 2))' – alistaire

答えて

1

これはおそらく何か?

m <- matrix(c(2,1,5,5,10,1), ncol = 6) 

list.seq.pairs <- lapply(seq(1, ncol(m), 2), function(x) { 
    m[,c(x, x+1)] 
}) 

> list.seq.pairs 
[[1]] 
[1] 2 1 

[[2]] 
[1] 5 5 

[[3]] 
[1] 10 1 

そして、あなたは、マトリクス状に複数の行を反復処理したいしている場合には、 あなたはこのように上記に拡張することができます。

mm <- matrix(1:18, ncol = 6, byrow = TRUE)  

apply(mm, 1, function(x) { 
    lapply(seq(1, length(x), 2), function(y) { 
    x[c(y, y+1)] 
    }) 
}) 

EDIT:

Iあなたが正確に何をしているのか本当に分かりません。あなたは各行が2×3行列に変換したい場合、私は、思う:

mm <- matrix(1:18, ncol = 6, byrow = TRUE)  

list.mats <- lapply(1:nrow(mm), function(x){ 
    a = matrix(mm[x,], ncol = 2, byrow = TRUE) 
}) 

> list.mats 
[[1]] 
    [,1] [,2] 
[1,] 1 2 
[2,] 3 4 
[3,] 5 6 

[[2]] 
    [,1] [,2] 
[1,] 7 8 
[2,] 9 10 
[3,] 11 12 

[[3]] 
    [,1] [,2] 
[1,] 13 14 
[2,] 15 16 
[3,] 17 18 

しかし、あなたは結果を取得したい、場合私はそれはあなたがしばらく操作を行う必要があるものは何でも計算を行うために、おそらく一番簡単だと思う行列 - あなたはそれぞれの行を扱っている:言わ

results <- t(apply(mm, 1, function(x) { 
    sapply(seq(1, length(x), 2), function(y) { 
    val1 = x[y] # Get item one 
    val2 = x[y+1] # Get item two 
    val1/val2 # Do your calculation here 
    }) 
})) 

> results 
      [,1] [,2]  [,3] 
[1,] 0.5000000 0.7500 0.8333333 
[2,] 0.8750000 0.9000 0.9166667 
[3,] 0.9285714 0.9375 0.9444444 

が、私はあなたがそう、これはマークを見逃すことが何をしようとして理解していません。新しい質問をして、実際の期待値を使って、サンプル入力と実際の予想出力を表示した場合は、もっと幸運かもしれません。

+0

は行列の形で答えを得ることができますか? – DataMiningStudent

+0

@DataMiningStudent - 確かに、Trebekですが、もっと具体的にすることはできますか?元の行列の各行、または1つの行列について別々の行列の後ろにいますか(そして後者の場合、上記のalistaireの解答を試しましたか?) –

+0

こんにちは、元のマトリックスの各行に別々のマトリックスが必要です。たとえば、1回の反復の後、私は計算に使うことができるように1つの行列を得ました。次に、次の反復は、別の行列と計算のための答えを供給します。私は自分自身を明確にすることを願っています。私の説明が混乱している場合は申し訳ありません。 – DataMiningStudent

関連する問題