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

时间:2015-05-11 15:40:21

标签: r hash max hashtable

我有一个哈希,看起来很像示例,我使用哈希包创建此哈希。

如何在R?

中返回最大值的键

输入哈希表:

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

2 个答案:

答案 0 :(得分:2)

对于简单值(长度为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"

答案 1 :(得分:1)

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

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

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

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

如果哈希符合解决方案,@ bergant的答案解决了OP的问题,但请理解它是相当危险的。将哈希转换为列表然后使用unlist忽略了哈希值不被约束为标量/原子值的事实。它们可以是任何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

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

更简单,更高性能和更通用的方法是使用'值'功能。在所有值都是标量/原子值的简单情况下,这与@ 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) ] )

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

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) ] )

我希望有所帮助。

相关问题