Сортировать список по значению, сохранив числовую клавишу в R - PullRequest
0 голосов
/ 21 марта 2019

Я знаю, что это общий вопрос, но общий ответ r[order(unlist(r))] не работает из-за цифровых клавиш. Я не могу найти ответы через некоторое время поиска. Я видел Как я могу получить верхние n значений с индексом в R? , но он использует фрейм данных, и я не знаю, как внедрить фрейм данных в мою функцию.

У меня есть список значений, которые я создал, используя r [[i]] <- <code>value в цикле. Теперь я хочу отсортировать этот список, но сохранить цифровую клавишу.

> r
[[1]]
[1] 4396750

[[2]]
[1] 6340260

[[3]]
[1] 8449058

[[4]]
[1] 5676146

> r <- r[order(unlist(r))]
> r
[[1]]
[1] 4396750

[[2]]
[1] 5676146

[[3]]
[1] 6340260

[[4]]
[1] 8449058

Мне нужен какой-то способ сохранить ключи, чтобы я знал, что значения, от самого низкого до самого высокого, представлены ключами 1,4,2,3. Тогда мне нужно будет сохранить ключи с самыми низкими 3 значениями. Поэтому мой конечный результат должен быть каким-то списком или вектором, который дает мне 1,4,2.

Мой пример упрощен, поэтому некоторые ярлыки, такие как «просто отбрось максимальное значение», не сработают.

Фактический код для функции здесь:

knnacc <- function(e){
  dist = list()
  for(j in 1:10000) {
    dist[[j]] <- distance(TEST[["image"]][[e]], TRAIN[["image"]][[j]])
  }
  #dist <- dist[order(unlist(dist))]
  return(dist)
}

Я бы хотел достичь точки, в которой функция возвращает 20 клавиш, связанных с наименьшим расстоянием из 60 000.

Ответы [ 2 ]

1 голос
/ 21 марта 2019

Цифровые клавиши - это просто указатель в списке. Чтобы сохранить исходные индексы в отсортированном списке, вы можете просто добавить имена в элементы списка на основе этих исходных индексов.

например.,

r = list(4396750, 6340260, 8449058, 5676146)
#> r
#[[1]]
#[1] 4396750
#
#[[2]]
#[1] 6340260
# 
#[[3]]
#[1] 8449058
#
#[[4]]
#[1] 5676146  

names(r) <- as.character(1:length(r))

r <- r[order(unlist(r))]

#> r
#$`1`
#[1] 4396750
#
#$`4`
#[1] 5676146
#
#$`2`
#[1] 6340260
#
#$`3`
#[1] 8449058
0 голосов
/ 21 марта 2019

Не уверен, почему вы хотите list, а не vector. Имея следующую фиктивную переменную, попробуйте:

> r
[[1]]
[1] 1

[[2]]
[1] 10

[[3]]
[1] 2

[[4]]
[1] 4

[[5]]
[1] 3

setNames(r[order(unlist(r))],order(unlist(r)))
$`1`
[1] 1

$`3`
[1] 2

$`5`
[1] 3

$`4`
[1] 4

$`2`
[1] 10
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...