首页 > 解决方案 > 按值对列表进行排序,同时在 R 中保留数字键

问题描述

我知道这是一个常见问题,但r[order(unlist(r))]由于数字键,常见答案不起作用。经过一段时间的搜索,我找不到任何答案。我确实看到了如何通过它在 R 中的索引获得前 n 个值?但这使用了一个数据框,我不知道如何在我的函数中实现一个数据框。

我有一个值列表,我在value循环中使用 r[[i]] <- 创建了这些值。现在我想对该列表进行排序,但保留数字键。

> 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

我需要一些方法来保留键,以便我知道从最低到最高的值由 keys 表示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)
}

我想达到一个函数返回与 60,000 中距离最低的 20 个键相关联的点。

标签: r

解决方案


“数字键”只是列表中的索引。要在排序列表中保留原始索引,您可以简单地根据这些原始索引向列表元素添加名称。

例如,

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

推荐阅读