对R中矩阵的附近元素求和

Summing nearby elements of a matrix in R

在 R 中,我正在尝试制作一个如下所示的简单函数,只是对数据框行中距 (i,j) 元素 k 个位置的元素求和。如果元素在边缘(例如 j=1 或 j=n),我希望将不存在的左侧或右侧元素视为 0。但是对于我当前的函数,我最终得到一个如果右边的元素不存在则返回错误,或者如果左边的元素不存在则返回向量,因为 R 的负索引行为。除了使用 if 语句来处理这三种情况(元素在中间、太左或太右)之外,还有更好的方法来编写此函数吗?

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

你可以做到

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
  • 第一个8实际上是x[1] + x[3],而不是x[-1] + x[3]
  • 第二个10x[1] + x[4],而不是x[0] + x[4]

如果您只想忽略那些 "out-of-bound" 值,请使用 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]
  }