R - 根据标准查找连续值

时间:2015-01-22 21:28:29

标签: r dataframe

我有一个有两个基本条件的数据集,我试图根据它们在数据框中的位置来匹配这些值。这是一个例子:

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

我希望匹配" n"的每个值。附近有一个" t" (即,在彼此的5行内)。然后,我想减去" n"的值。来自" t"。在上面的示例中,我们的第1行将与第3行匹配,并且我们的值为25(375 - 350)。如果行在两个" t"之间是等距的。行,我想默认为早期" t"排,如果可能的话。理想情况下,我会在适当的情况下创建一个具有这些差异分数的新向量,以便" NA"或" 0"对于带有" t"的行显示条件。所以这看起来像:

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

有没有办法在R中实现这个?我已根据标准尝试了一些子集(例如,""或" =="),但我想知道我是否在我以错误的方式接近它!任何见解将不胜感激! :)

1 个答案:

答案 0 :(得分: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)
}