在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]
}
答案 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]
。10
是x[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]
}