如何在 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) ] )
希望对您有所帮助。
我有一个 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) ] )
希望对您有所帮助。