【问题标题】:How to create a dictionary / hash table by iterating through a column?如何通过遍历列来创建字典/哈希表?
【发布时间】:2011-12-09 22:16:09
【问题描述】:

我有一个包含两列的数据框:键和值,我想为字典/哈希表的每个元素使用每列的相应行创建一个字典。

据我了解,使用 R 字典/哈希表的典型方法是执行类似的操作。

labels.dic <- c("Id of the item and some other description" = "id")

这工作得很好,但是当我尝试使用数据框中的值(在示例中名为 lbls)时,它不起作用。为什么会这样?

labels.dic <- c(lbls[1,1]=lbls[1,2])
Error: unexpected '=' in "c(lbls[1,1] ="

【问题讨论】:

  • R 不做字典,你正在尝试使用一种语言,它的设计目的不是像木匠试图用螺丝刀在地上挖洞一样。当然,您可以扭曲自己并非常努力地做类似的事情,但是人们只会觉得您很有趣。 R 不是为这种类型的迭代数据操作而设计的。
  • 是的,R 数据结构是有限的,这是一个严重的问题refsmmat.com/posts/2016-09-12-r-lists.htmlpython/julia 使用起来更愉快(而且更快!)。
  • 什么是命名列表,如果不是字典?
  • @Marc 多年后我也意识到了这一点

标签: r dictionary hashtable


【解决方案1】:

另一个与 Python 或 Perl 类似的选项是 hash 包。见:http://cran.r-project.org/web/packages/hash/

如果您的密钥特别长,那么我建议存储两个哈希表。首先,使用digest 包对键进行哈希处理,并存储一个字典(哈希表),该字典从摘要映射到键(从键到摘要的映射已经由digest 包完成;-)),然后从消化到您希望存储的值。这对我来说效果很好。

【讨论】:

    【解决方案2】:

    在我看来,您收到了一些错误信息。我什至不确定您从哪里得到创建哈希表的语法的想法。

    无论如何:对于类似哈希表的功能,您可能需要考虑使用environment:这些在内部使用哈希表(如果我没记错的话),所以做你想做的事。

    你可以这样使用:

    someenv<-new.env()
    someenv[["key"]]<-value
    

    鉴于你的data.frame,这样的东西会填满它:

    for(i in seq(nrow(lbls)))
    {
      someenv[[ lbls[i,1] ]]<- lbls[i,2]
    }
    

    (注意:这要求第一列是一个实际的字符列,而不是一个因素!!)

    然后,您可以使用 someenv[["nameofinterest"]] 轻松获取命名值。

    【讨论】:

    • Nick here 是我看到这个符号的地方。我已经成功地用符号 dictionary[[key]]
    • 好的,我明白你的意思了。在您的示例中,我只使用 1 个键/值对让我感到厌烦。仍然:环境应该在这种事情上具有更好的性能。如果性能不是问题,命名向量(如@kohske 建议的)或列表就可以了。
    • @pedrosaurio - 是的,当你有几个 1000 个条目时,环境会更快。 R 2.12 及更早版本需要new.env(hash=TRUE)(它们在 2.13 中更改为 hash=TRUE)。
    【解决方案3】:

    最简单的方法是在创建变量后更改names。所以你可以像这样定义一个函数:

    cc <- function(name, value) {
        ret <- c(value)
        names(ret) <- name
        ret
    }
    
    cc(c(letters[1:2], "a name"), c(LETTERS[1:2], "a value"))
    
    # output like this
    #    a         b    a name 
    #   "A"       "B" "a value" 
    

    【讨论】:

    • 这就是为什么你应该阅读 help(package = base)help(package = stats) ;)
    • 使用 hash 参数的环境和使用 name 函数的环境有什么区别?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-19
    • 1970-01-01
    • 2017-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-21
    相关资源
    最近更新 更多