使用R的字典映射

时间:2018-03-30 05:01:03

标签: r dictionary dataframe dplyr tidyr

我有一个包含两列和数千行的数据框 - 比如A列和B列。

列A是键,列B是值。

A   B
-----
a1  1
w1  2
ee  3

在用户打印a1, w1时,我想提供等效的1, 2

2 个答案:

答案 0 :(得分:2)

您只需要%in%运算符,例如

with(dat, B[A %in% c("a1","w1")])
# [1] 1 2

答案 1 :(得分:1)

字典结构通常用于允许键值到值对的快速映射。您当前的结构不高效,也不构成键值对。你基本上有一个对象(数据框),其中嵌套了两个对象(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

这里发生了什么?如果列表包含超过100个元素,list2envnewenv(hash = TRUE)的包装,因此如果需要,它会提供持续时间查找。

来自@ r2evans reference的评论如下:

  

newenv(hash = TRUE))是用C实现的哈希表的瘦包装,性能显示...在R中,如果你需要存储键值对,你的键总是有效的R符号,内置new.env(hash=TRUE)是明显的赢家!