2016-09-23 12 views
0

これはおそらく前に投稿された他のものと同様の質問ですが、完全に一致するものは見つかりませんでした。同じベクトルの値に基づいてベクトル値を変更してください

とにかく、私は19列から5,000行の行列を持っています。したがって、ベクターは再びオーバー開始前に0.1に1から行く

0 0.6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0.5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0.4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
... 
0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0.9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0.8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 

:各行は0.1(したがって、0.0、0.1,0.2 ... 1.0)従ってなどの単位で0.0と1の間に1つの値を含みます1に移り、次の列に移動します。私は基本的に行から行に移動し、数値があるかどうかを調べ、ベクトルの次の場所にその値から1を引いた関数を欲しいと思います。効果的にこのように:

0 0.6 0.4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0.5 0.5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0.4 0.6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
... 
0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0.9 0.1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0.8 0.2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 

私は、「適用」または単に再コーディングが、トリックはそれがすべて〜5000行を実行するようになっているベースでいくつかのことを試してみました。多分私は列を通過することによってそれにアプローチする必要がありますか?

+0

'ifelse'で列を操作し、前の列の値を確認し、条件が一致したときに現在の列を変更できます。 'ifelse'はベクトル化されているので、すべての列演算は高速です。 forループは、右端の列から左に開始する必要があります。 – dracodoc

+0

別の方法は、変更するセルのインデックスをすべて計算し、それらをベクトルに入れ、同じ順序で更新するすべての値を計算し、別のベクトルに入れてインデックスで更新します。 – dracodoc

答えて

0

別途価値とインデックスを考えてください。 Rでの索引付けは非常に強力です。

# simulate data. smaller size for simplification 
m <- matrix(0, nrow = 200, ncol = 12) 
r_indice <- 1:200 
c_indice <- rep(2:11, each = 10) 
m[cbind(r_indice, c_indice)] <- rep(seq(0.1, 1, by = 0.1), 10) 

# find non-zero value indice 
value_indice <- which(m !=0, arr.ind = T) 
new_value_indice <- value_indice 
new_value_indice[, 2] <- new_value_indice[, 2] + 1 
m[new_value_indice] <- 1 - m[value_indice] 
+0

ありがとう!これは完全に機能しました。私はマトリックス全体を一度に索引付けすることは考えていませんでした。私がしなければならなかった唯一の変更は、列インデックス参照の "+1"シフトに対応するために、マトリックスの最後にダミー列を追加することでした。そうでなければ、「範囲外の添え字」エラーが発生しました。行列の残りの部分に影響を与えずに、単にその列を削除することができます。 – Jsukup

0

単純な行列乗算と行列インデックスを組み合わせたアプローチがあります。まず、各行に1と-1のペアを持つ19×20行列を作成します。

mat <- diag(20) 
mat[row(mat) - col(mat) == -1] <- -1 
mat <- mat[-20, ] 

mat次のようになります。

#  [,1] [,2] [,3] [,4] [,5] [,6] ... 
# [1,] 1 -1 0 0 0 0 
# [2,] 0 1 -1 0 0 0 
# [3,] 0 0 1 -1 0 0 
# [4,] 0 0 0 1 -1 0 
# [5,] 0 0 0 0 1 -1 
# [6,] 0 0 0 0 0 1 
# ... 

は、元の行列がxであると仮定します。その後、我々はxmatを掛け:そう

y <- x %*% mat 

我々はxと同じ番号を取り戻すだけでなく、隣接する列におけるそれらの数値の負のこと:最後に

 [,1] [,2] [,3] [,4] [,5] [,6] 
[1,] 0 0.6 -0.6 0.0 0 0 
[2,] 0 0.5 -0.5 0.0 0 0 
[3,] 0 0.4 -0.4 0.0 0 0 
[4,] 0 0.0 1.0 -1.0 0 0 
[5,] 0 0.0 0.9 -0.9 0 0 
[6,] 0 0.0 0.8 -0.8 0 0 

は、すべてに1を追加します負の数:

y[y < 0] <- (y + 1)[y < 0] 
y[1:6, 1:6] 
#  [,1] [,2] [,3] [,4] [,5] [,6] 
# [1,] 0 0.6 0.4 0.0 0 0 
# [2,] 0 0.5 0.5 0.0 0 0 
# [3,] 0 0.4 0.6 0.0 0 0 
# [4,] 0 0.0 1.0 0.0 0 0 
# [5,] 0 0.0 0.9 0.1 0 0 
# [6,] 0 0.0 0.8 0.2 0 0 
関連する問題