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

时间:2016-10-22 22:30:22

标签: r dataframe indices

在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]
}

1 个答案:

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

如果你只是想忽略那些&#34;越界&#34;值,使用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]
  }