按值对列表排序,同时在R中保留数字键

时间:2019-03-21 13:46:10

标签: r

我知道这是一个常见问题,但是由于数字键,r[order(unlist(r))]的常见答案无法正常工作。经过一段时间的搜索,我找不到任何答案。我确实看到了How can I get top n values with its index in R?,但是它使用了一个数据框,而且我不知道如何在我的函数中实现一个数据框。

我有一个在循环中使用r [[i]] <-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 个答案:

答案 0 :(得分:1)

“数字键”只是列表中的索引。要将原始索引保留在已排序的列表中,您可以仅基于这些原始索引将名称添加到列表元素中。

例如,

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

答案 1 :(得分:0)

不确定为什么要使用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