2011-10-18 160 views
9

我有一个两列的数据框:键和值,我想创建一个字典使用字典/哈希表的每个元素的每个列的相应行。如何通过遍历列来创建字典/散列表?

据我了解,使用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] =" 
+0

R不会做字典,你正在尝试使用一种语言,它的设计并不像木匠那样被用来试图用螺丝刀在地上挖一个洞。当然,你可以扭曲自己,努力工作来做类似的事情,但人们只会看你有趣。 R不适用于这种类型的迭代数据操作。 –

回答

8

在我看来你已经得到了一些错误的信息。我甚至不确定你在哪里得到创建散列表的语法的想法。

在任何情况下:对于类似散列表的功能,您可能需要考虑使用environment:这些工作可以在内部使用散列表(如果我没有记错的话),所以请按照您的要求进行操作。

你可以使用此类似:

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

鉴于你data.frame,这样的事情将填补起来:

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

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

然后,您可以通过使用someenv[["nameofinterest"]]轻松获得指定值。

+0

尼克[这里](http://tolstoy.newcastle.edu.au/R/help/06/02/20391.html)是我看到这个符号的地方。 我已经用符号字典[[key]] < - value成功地填充了我的字典/散列表。我仍然不知道为什么这种方式是一种方式,而不是其他方式。谢谢你的帮助。 – pedrosaurio

+0

好的,我明白你的意思了。在您的示例中,我只使用1个键/值对推迟了您的选择。尽管如此:环境应该在这类事情上有更好的表现。如果性能不是问题,则命名向量(如@kohske建议)或列表将会很好。 –

+1

@pedrosaurio - 是的,当你有几千个条目时,环境的幅度会更快。在R 2.12及更早版本中需要'new.env(hash = TRUE)'(它们在2.13中改为hash = TRUE)。 – Tommy

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" 
+1

您的cc已经存在 - 它被称为setNames。 – hadley

+1

明白了。我认为这很难找到,虽然... – kohske

+2

这就是为什么你应该阅读'help(package = base)'和'help(package = stats)';) – hadley

3

另一种类似于您用Python或Perl看到的选项是hash包。请参阅:http://cran.r-project.org/web/packages/hash/

如果您的密钥特别长,那么我建议存储两个散列表。首先,使用digest包对散列密钥进行散列,并存储从摘要到密钥(从密钥到摘要的映射已由digest包完成;-))的字典(散列表),然后从摘要到值你想存储。这对我很好。

相关问题