我有一个哈希,看起来很像示例,我使用哈希包创建此哈希。
如何在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
答案 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) ] )
我希望有所帮助。