2015-01-22 2 views
2

두 가지 기본 조건이있는 데이터 세트가 있는데 데이터 프레임의 위치에 따라이 값을 비교하려고합니다. I는 "t"근방의 값 "n"은 각각의 값과 일치하려는R - 기준에 따라 행의 값 찾기

Row Cond Y 
1 n 350 
2 n 354 
3 t 375 
4 n 300 
5 n 157 
6 t 810 
7 n 214 
8 n 243 
9 n 345 
10 n 216 
11 n 198 
12 t 870 

(즉, 서로의 5 행 내) : 다음의 예이다. 그런 다음 "t"에서 "n"의 값을 뺍니다. 위의 예에서 행 1은 행 3과 일치하고 값 25 (375 - 350)로 나타납니다. 행이 두 "t"행 사이에 등거리가있는 경우 가능하면 이전 "t"행을 기본값으로 사용하고 싶습니다. 이상적으로, "t"조건을 가진 행에 대해 "NA"또는 "0"이 표시되도록 적절한 경우 해당 차이 점수를 사용하여 새 벡터를 만듭니다. 그러면 다음과 같이 보일 것입니다 :

Result 
25 
21 
NA 
75 
653 
NA 
596 
567 
465 
654 
672 
NA 

R에서 이것을 구현할 방법이 있습니까? 기준 (예 : "<"또는 "==")을 기반으로 몇 가지 하위 집합을 시도했지만 잘못된 방식으로 접근하고 있는지 궁금합니다. 어떤 통찰력이라도 대단히 감사하겠습니다! :)

+0

그래서 n이 두 t의 8 행 사이의 거리가 같으면 어떻게됩니까?) 샘플 데이터를 제공하는 것이 좋지만이 샘플 데이터에 대한 원하는 결과가 무엇인지 공유하면 도움이 될 수 있으므로 가능한 솔루션을 테스트 할 수 있습니다. – MrFlick

+0

원하는 출력은 어떻게 생깁니 까? –

+0

예상 출력 및 몇 가지 설명으로 업데이트되었습니다. 봐 주셔서 감사합니다! – alexd

답변

0
getclosest <- function(df, i) { 
    if (as.character(df$Cond[[i]]) == "t") { 
     return (NA) 
    } else { 
     # df$Y[i] 
     below <- NA 
     above <- NA 
     aj <- NA 
     bj <- NA 
     for (j in 1:5) { 
      pos <- i - j 
      if (pos < 1) break 
      if (df$Cond[pos] == "t") { 
      below <- df$Y[pos] 
      bj <- j 
      break 
      } 
     } 
     for (j in 1:5) { 
     pos <- i + j 
     if (pos > nrow(df)) break 
     if (df$Cond[pos] == "t") { 
      above <- df$Y[pos] 
      aj <- j 
      break 
     } 
     } 
     temp = NA 
     tempb = NA 
     if (is.na(above) && is.na(below)) { 
      return(NA) 
     } 
     if (!is.na(below) && !is.na(above)) { 

     if (aj < bj) { 
      return(abs(above - df$Y[i])) 
     } else { 
      return(abs(below - df$Y[i])) 
     } 
     } 
     if (!is.na(below)) { 
     tempb <- abs(below - df$Y[i]) 
     return (tempb) 
     } 
     if (!is.na(above)) { 
     tempa <- abs(above - df$Y[i]) 
     return(tempa) 
     } 

    return (NA) 
    } 
} 

df <- data.frame(Cond=c('n', 'n', 't','n','n','t','n','n','n','n','n','t'), Y=c(350,354,375,300,157,810,214,243,345,216,198,870)) 

v <- c() # length=nrow(df)) 
for (i in 1:nrow(df)) { 
    v[i] <- getclosest(df, i) 
} 
+1

스콧,이 완벽하게 작동합니다! 당신의 시간과 통찰력에 감사드립니다! – alexd

+0

여러분을 환영합니다! 내 솔루션을 upvote 수 있습니다. –

관련 문제