字典结构通常用于实现键值对的快速映射。您当前的结构效率不高,也不是键值对。您基本上有一个对象(数据框),其中嵌套了两个对象(A 和 B)。要检索您的值,您需要在一个对象 (A) 中查找该值,找到它的行(实际上是它的索引位置),然后在另一个对象 (B) 中检索索引。一个更好的结构是命名向量:
x = c(a1 = 1, w2 = 2, ee = 3)。或者更好的是,使用list2env。
L <- list(a1 = 1, w2 = 2, ee = 3)
e <- list2env(L)
e$a1
# [1] 1
这具有恒定的时间查找,这是您想要的字典结构(见下文)
以下是将特定结构转换为环境的方法:
# if df is your data frame
L <- as.list(df$B)
names(L) <- df$A
e <- list2env(L, hash = TRUE)
e$a1
# [1] 1
查找的替代方案:
with(e, {
< do something>
a1 # maps to 1
})
或者
attach(e)
a1
# [1] 1
detach(e) # this is the disadvantage here: you have to remember to detach
这里发生了什么? list2env 是 newenv(hash = TRUE) 的包装器,如果列表包含超过 100 个元素,因此它会在需要时提供恒定时间查找。
来自以下 cmets 中的 @r2evans reference:
(newenv(hash = TRUE)) 是在 C 中实现的哈希表上的瘦包装器,性能表明...在 R 中,如果您需要存储键值对,并且您的键始终是有效的 R 符号,内置new.env(hash=TRUE) 是明显的赢家!