2016-10-22 5 views
0

R에서 나는 (i, j) k 위치에 떨어져있는 데이터 프레임의 행에있는 원소들을 합산하는 것과 같은 간단한 함수를 만들기 위해 노력하고 있습니다. 요소. 요소가 가장자리 (예 : 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] 
    } 

이의 K-동네 대칭 경계에 가까운 없음을 의미 할 수 있습니다.

sapply(1:5, f, k = 2, x = x) 
# [1] 8 10 12 14 16 
  • :

    x <- seq(2, 10, by = 2) 
    # [1] 2 4 6 8 10 
    

    이의이 k = 2 모든 요소의 합계 효과를 테스트하자

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

    말 :

    는 이제 벡터와 단순화 된 케이스/예를 살펴 보자 첫 번째 8x[-1] + x[3] 대신 실제로 x[1] + x[3]입니다.
  • 두 번째 10x[0] + x[4]이 아닌 x[1] + x[4]입니다.

    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] 
        } 
    
    : 당신은 단순히 그 "아웃 오브 바운드"값을 무시하려는 경우

if 사용