2016-10-22 5 views
0

Rでは、以下のような単純な関数を作成しようとしています.k番目の(i、j)番目のデータフレームの行の要素を加算するだけです。素子。要素がエッジ(例:j = 1またはj = n)上にある場合、要素は左または右にありますが、存在しない要素は0として扱いたいと思います。しかし、私の現在の関数では、右側の要素が存在しない場合はエラー、負のインデックスを持つRの動作のために左側の要素が存在しない場合はベクトルです。 3つのケース(要素が中間、あまりにも遠すぎる、またはあまりにも右)に対処するためにifステートメントを使用するだけでなく、この関数を記述する方法がありますか?行列の近傍の要素を集計するR

sum_nearby <- function(dat, i, j, k) { 
dat[i, j - k] + dat[i, j + k] 
} 

答えて

1

あなたは

sum_nearby <- function(dat, i, j, k) { 
    left <- max(1, j - k) 
    right <- min(j + k, ncol(dat)) 
    dat[i, left] + dat[i, right] 
    } 

を行うことができますこれは、境界に近い、K-近傍は対称ではないことを意味します。

のは、ベクターで簡素化ケース/例を考えてみましょう:

f <- function (x, j, k) { 
    left <- max(1, j - k) 
    right <- min(j + k, length(x)) 
    x[left] + x[right] 
    } 

セイ

x <- seq(2, 10, by = 2) 
# [1] 2 4 6 8 10 

だがk = 2を持つすべての要素の合計の効果をテストしてみましょう:

sapply(1:5, f, k = 2, x = x) 
# [1] 8 10 12 14 16 
  • 最初の8x[-1] + x[3]ではなく、実際にはx[1] + x[3]です。
  • 第2の10x[0] + x[4]ではなくx[1] + x[4]です。

あなたは、単にifを使用し、それらの "アウトオブバウンド" の値を無視する場合:

sum_nearby <- function(dat, i, j, k) { 
    if (j - k < 0) dat[i, j + k] 
    else if (j + k > ncol(dat)) dat[i, j - k] 
    else dat[i, j + k] + dat[i, j - k] 
    } 
関連する問題