如何在 Hash R 中找到最大值的键?

How to find the keys of the largest values in Hash R?

我有一个 hash 看起来像示例,我使用 hash 包创建了这个哈希。

如何 return R 中的最大值键?

输入哈希 table :

h<-hash( keys=c(1,4,5,6),values=c(30,25,25,30) )
 # <hash> containing 3 key-value pair(s).
 #  1 : 30
 #  4 : 25 
 # 5 : 25
 # 6 : 30

对于简单值(长度为 1 的向量),这有效:

H <- hash(a = 5, b = 2, c = 3, d = 5)
H

# <hash> containing 4 key-value pair(s).
#   a : 5
#   b : 2
#   c : 3
#   d : 5

val <- unlist(as.list(H))  # convert to list and to named vector
names(val[val == max(val)])

# [1] "a" "d"

完全披露:我编写并维护了 hash 包。

除非您有一个包含许多键值对的散列并且需要性能,否则带名称的标准 R 向量可能是更好的解决方案。这是一个例子:

v <- c(a = 5, b = 2, c = 3, d = 5)
names( v[ v==max(v) ] )

在结构增长超过 ~200 个键值对之前,原生 R 向量将优于哈希。 (自从我对哈希、向量和列表查找性能进行基准测试以来已经有一段时间了)。

如果哈希符合解决方案,@bergant 的回答解决了 OP 的问题,但请理解这是相当危险的。将散列转换为列表然后使用 unlist 会忽略散列值不限于 scalar/atomic 值这一事实。它们可以是任何 R 对象。考虑:

 > hash(a = 1:5, b = 2, c = 3, d=5)
 <hash> containing 4 key-value pair(s).
 a : 1 2 3 4 5
 b : 2
 c : 3
 d : 5

您可以决定这是否是您的应用程序的问题。

一种更简单、性能更高且更通用的方法是使用 'values' 函数。在所有值都是 scalar/atomic 值的简单情况下,这与@bergant 的解决方案非常相似。

H <- hash(a = 5, b = 2, c = 3, d = 5)
val <- values(H)     # Compare to `unlist(as.list(H))`
names( val[ val == max(val) ] )

由于值 returns 一个命名列表而不是一个未列出的列表,我们为更通用的解决方案设置,因为我们可以 select 从每个键值对中比较一个值:

H <- hash(a = 1:5, b = 2, c = 3, d=5)
val <- values(H)

# Alternate 1: Compare min from each value
val <- sapply(val, max )

# Alternate 2: Compare first element from each value 
# val <- sapply(val, function(x) x[[1]])

names( val[ val == max(val) ] )

希望对您有所帮助。