【问题标题】:Summing nearby elements of a matrix in R在R中对矩阵的附近元素求和
【发布时间】:2017-03-05 00:10:01
【问题描述】:

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

【问题讨论】:

    标签: r dataframe indices


    【解决方案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]

    如果您只是想忽略那些“越界”值,请使用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]
      }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-28
      • 1970-01-01
      • 1970-01-01
      • 2019-08-24
      • 2021-09-20
      • 1970-01-01
      • 2017-09-30
      • 1970-01-01
      相关资源
      最近更新 更多