我知道这是一个常见问题,但是由于数字键,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以内的最小距离相关的键的点。
答案 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