【问题标题】:dictionary mapping using R使用 R 的字典映射
【发布时间】:2018-09-09 03:40:06
【问题描述】:

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

A 列是键,B 列是值。

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

在打印a1, w1 的用户上,我想给出它的等价物1, 2

【问题讨论】:

  • “关于用户打印” ...我不清楚。您的意思是当您在控制台上键入a1 时,您希望它自动返回(打印?)1?还是"a1" 存储在变量、向量或data.frame 列中,您想用1 替换它?

标签: r dictionary dataframe dplyr tidyr


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    来自以下 cmets 中的 @r2evans reference

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

    【讨论】:

    • 所有这些仍然有效:L$a1with(L, a1)attach(L);a1(尽管我建议不要使用 attach)。 list2env 是什么在这里增加了任何价值或性能?
    • @r2evans 它使用new.env,如果对象的大小> 100,则使用哈希值。因此,如果需要,它会进行恒定时间查找。
    • 很有趣,谢谢。 (blog.dominodatalab.com/… 支持基准测试和更多理由。)
    • @jenesaisquoi 是的,命名向量没有被散列。它必须搜索它的名字。它是与 OP(一个原子向量与两个原子向量的列表)不同的结构。改进不是关于查找速度的效率,而是表达式x["a1"] 的简单性。正如我所说,查找速度更好的结构是list2env 生成的哈希结构。我赞成您的解决方案,因为它适用于 OP 当前的结构,并且我认为,通过两个更好的键值对结构示例以及如何创建它们的说明,给出了一个很好的、深思熟虑的答案。
    • 我的意思是它可以很容易地实现为哈希,这在其他具有类似命名向量语法的语言中很常见。我认为对于 R 来说,这将是一个不错的功能。我认为 R 具有糟糕的哈希支持,它很少在环境之外使用
    猜你喜欢
    • 2011-08-25
    • 2018-06-20
    • 2018-04-21
    • 2011-10-18
    • 2010-09-12
    • 2021-12-27
    • 1970-01-01
    • 1970-01-01
    • 2017-06-01
    相关资源
    最近更新 更多