我有一个包含两列和数千行的数据框 - 比如A列和B列。
列A是键,列B是值。
A B
-----
a1 1
w1 2
ee 3
在用户打印a1, w1
时,我想提供等效的1, 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个元素,list2env
是newenv(hash = TRUE)
的包装,因此如果需要,它会提供持续时间查找。
来自@ r2evans reference的评论如下:
(
newenv(hash = TRUE)
)是用C实现的哈希表的瘦包装,性能显示...在R中,如果你需要存储键值对,你的键总是有效的R符号,内置new.env(hash=TRUE)
是明显的赢家!