我有一个与值相关联的标签列表。我希望,对于值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
还有另一种巧妙的做法吗?
答案 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"