查找与一系列值匹配的行

时间:2016-08-29 16:52:23

标签: r

我正在尝试将列importantval作为一个范围内的数字。我不知道如何开始这个,任何人都有任何想法?

data<-data.frame(lower=c(1,4,6,7,7),upper=c(3,5,7,8,9),importantval=c(99,98,97,96,95))
vals<-c(1.14,3.5,7.2,19)

> data
  lower upper importantval
1     1     3           99
2     4     5           98
3     6     7           97
4     7     8           96
5     7     9           95

输出目标

# 1.14 99
# 3.5 NA
# 7.2 96 <--return the smalller interval (from 7 to 8 is smaller than 7 to 9)
# 19 NA <--doesnt exist so return NA

1 个答案:

答案 0 :(得分:2)

一个简单的lapply可以解决问题。识别线路相对容易。当多个值工作时,if语句只占较小的间隔,这有点难以理解,但大多数情况下,如果有多种可能性,我会选择间隔等于可能的最小间隔的行。

foo <- function(i) {
  res <- data[data$lower < i & data$upper > i, ]
  if (nrow(res) > 1) {
    res <- res[which(res$upper - res$lower == min(res$upper - res$lower)), ]
  }
  if (nrow(res) == 0) return(NA)
  return(res$importantval)
}

results <- data.frame(vals, sapply(vals, foo))

这假设没有相同长度的间隔。如果有可能,您可以在末尾添加return(min(res$importantval))以仅获取较小的值。

如果您想要保留两个值,请将结果列在列表中:

results <- lapply(vals, foo)
names(results) <- vals