找到最近的较小数字

时间:2015-05-18 22:50:05

标签: r vector numeric

有一个带有以下数字的向量

f<-c(1,3,6,8,10,12,19,27)

哪个元素最接近18.所以19将是最接近的元素,但函数需要返回6(这意味着值为12),因为向量中的元素总是较小,除非它等于输入。 如果输入为19,则输出需要为7(索引)......

7 个答案:

答案 0 :(得分:11)

我认为这个答案很简单:

f <- c(1,3,6,8,10,12,19,27)
x <- 18

# find the value that is closest to x
maxless <- max(f[f <= x])
# find out which value that is
which(f == maxless)

答案 1 :(得分:6)

如果您的向量f始终排序,则可以执行sum(f <= x)

f <- c(1,3,6,8,10,12,19,27)

x <- 18
sum(f <= x)
# [1] 6

x <- 19
sum(f <= x)
# [1] 7

答案 2 :(得分:4)

试试这个(不是完美的解决方案)

x<-c(1,3,6,8,10,12,19,27)
showIndex<-function(x,input){
 abs.diff<-abs(x-input)
 index.value<-unique(ifelse(abs.diff==0,which.min(abs.diff),which.min(abs.diff)-1))
return(index.value)
 }
 showIndex(x,12)
    [1] 6
showIndex(x,19)
[1] 7

答案 3 :(得分:2)

你可以尝试:

x <- 18
f <- c(1,3,6,8,10,12,19,27)

ifelse(x %in% f, which(f %in% x), which.min(abs(f - x)) - 1)

如果x不在f中,它将返回最近的索引。如果x位于f,则会返回x索引。

答案 4 :(得分:2)

另一个:

pos='v'

或作为一项功能:

which.min(abs(18 - replace(f, f>18, Inf)))
#[1] 6

f[which.min(abs(18 - replace(f, f>18, Inf)))]
#[1] 12

答案 5 :(得分:0)

在函数式编程风格中:

f <- c(1, 3, 6, 8, 10, 12, 19, 27)
x <- 18
Position(function(fi) fi <= x, f, right = TRUE)

答案 6 :(得分:0)

findInterval

findInterval(18:19, f)
#[1] 6 7

建立更具体的功能:

ff = function(x, table)
{
    ot = order(table)
    ans = findInterval(x, table[ot]) 
    ot[ifelse(ans == 0, NA, ans)]
}

set.seed(007); sf = sample(f)
sf
#[1] 27  6  1 12 10 19  8  3
ff(c(0, 1, 18, 19, 28), sf)
#[1] NA  3  4  6  1