对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]
。
- 第二个
10
是x[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]
}
在 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]
。 - 第二个
10
是x[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]
}