有一个带有以下数字的向量
f<-c(1,3,6,8,10,12,19,27)
哪个元素最接近18.所以19将是最接近的元素,但函数需要返回6(这意味着值为12),因为向量中的元素总是较小,除非它等于输入。 如果输入为19,则输出需要为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