在R中的列表中查找最接近的值

时间:2018-06-04 07:50:40

标签: r list find

我有一个与值相关联的标签列表。我希望,对于值x,找到与列表中最接近(但较低)值相对应的标签。

我找到了一种方法,但看起来很混乱......

mylist <- list("A"=0.02,
               "B"=0.13,
               "C"=0.26)

x = 0.14 # B

df <- as.data.frame(t(as.data.frame(mylist)))
df <- tibble::rownames_to_column(df, "labels")
df$V2 <- x > df$V1
maxi <- max(df[df$V2 == TRUE,]$V1)
label <- df[df$V1 == maxi,]$labels

还有另一种巧妙的做法吗?

4 个答案:

答案 0 :(得分:1)

我们用x的每个值减去mylist的值,过滤掉差值大于0的值,然后选择最小差值的names

new <- x - unlist(mylist) 
names(which.min(new[new > 0]))
#[1] "B"

或者是一个-liner,我们只过滤那些小于x的值并从中选择max

names(which.max(sapply(mylist, function(i) i[(x - i) > 0])))
#[1] "B"

答案 1 :(得分:0)

你的清单应该是一个载体:

myvector <- c("A"=0.02,
              "B"=0.13,
              "C"=0.26)
#sort
myvector <- sort(myvector, decreasing = TRUE)
#test
test <- x > myvector
#name of element with first TRUE in test
res <- if(any(test)) names(which.max(test)) else NA_character_
#[1] "B"

答案 2 :(得分:0)

您可以决定对矢量进行排序,然后取以前的值:

a=sort(c(x=x,unlist(mylist)))
names(a[which(names(a)=="x")-1])
[1] "B"

答案 3 :(得分:0)

我推荐其他更紧凑的解决方案,但这是你想要完成的一个整洁的版本:

library(tidyverse)
mylist %>%
  as_tibble %>%
  gather %>%
  filter(value < x) %>%
  summarize(key=key[which.max(value)]) %>%
  pull(key)

# [1] "B"