Найти ближайшее значение в списке в R - PullRequest
0 голосов
/ 04 июня 2018

У меня есть список меток, связанных со значениями.Я бы хотел, чтобы для значения 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 голосов
/ 04 июня 2018

Я рекомендую другие более компактные решения, но вот опрятная версия того, что вы пытались достичь:

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

# [1] "B"
0 голосов
/ 04 июня 2018

Ваш список должен быть вектором:

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"
0 голосов
/ 04 июня 2018

Вы можете решить отсортировать вектор, а затем принять предыдущее значение:

a=sort(c(x=x,unlist(mylist)))
names(a[which(names(a)=="x")-1])
[1] "B"
0 голосов
/ 04 июня 2018

Мы вычитаем значение x с каждым значением mylist, отфильтровываем те, где разница больше 0, и выбираем names минимальной разности.

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

Или однострочный, где мы фильтруем только те значения, которые меньше x и выбираем из него max.

names(which.max(sapply(mylist, function(i) i[(x - i) > 0])))
#[1] "B"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...