2016-10-22 6 views
0

В R я пытаюсь сделать простую функцию, подобную приведенной ниже, просто суммируя элементы в строке кадра данных, которые являются k позициями (i, j) элемент. Если элемент находится на краю (например, j = 1 или j = n), я бы хотел, чтобы элемент слева или справа не существовал, чтобы его обрабатывали как 0. Но с моей текущей функцией я получаю если элемент справа не существует, или вектор, если один из них не существует из-за поведения R с отрицательными индексами. Есть ли лучший способ написать эту функцию, не используя инструкции if для рассмотрения трех случаев (элемент находится в середине, слишком далеко слева или слишком далеко справа)?Подведение близлежащих элементов матрицы в R

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

ответ

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

Это означает, что близко к границе, к-окрестность не является симметричным.

Рассмотрим упрощенный случай/пример с вектором:

f <- function (x, j, k) { 
    left <- max(1, j - k) 
    right <- min(j + k, length(x)) 
    x[left] + x[right] 
    } 

Say

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].

Если вы просто хотите, чтобы игнорировать эти «вне переплете» значения, используйте 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] 
    } 

 Смежные вопросы

  • Нет связанных вопросов^_^