使用对应表翻译R中的向量元素

时间:2016-08-08 15:13:43

标签: r performance hash

R中执行以下操作的有效且简单的方法是什么:

  1. 从文件中读取两列数据
  2. 使用此信息构建某种翻译字典,如python dict
  3. 将翻译应用于向量的内容,以获得翻译的向量,可能是几个向量,但使用相同的对应信息
  4. 我认为hash package会帮助我做到这一点,但我不确定我是否正确执行了第3步。

    说我的初始向量是my_vect,我的哈希是my_dict 我尝试了以下方法: values(my_dict, keys=my_vect)

    以下观察让我怀疑我是以正确的方式做到这一点:

    1. 操作似乎很慢(在功能强大的桌面计算机上超过一秒,矢量为582个条目,散列为46665个条目)
    2. my_vec导致某些内容看起来不均匀:my_vec显示为“数字索引”(我的意思是方括号之间的整数出现在值的一侧)在交互式控制台中显示数据),如上所述调用values的结果看起来仍然看起来像字典:每个显示的翻译值都具有显示在其上方的原始值(即散列键)。我只想要价值观。
    3. 编辑:

      如果我理解正确,R有一些方法可以使用“名称”代替向量的数字索引,而我使用values函数获得的是带有名称的向量。它似乎适用于我想做的事情,虽然我想它需要的内存比必要的多。

2 个答案:

答案 0 :(得分:1)

我尝试了库哈希和hashmap,第二个看起来效率更高。

一个小用法示例:

> library(hashmap)
> keys = c("a", "b", "c", "d")
> values = c("A", "B", "C", "D")
> my_dict <- hashmap(keys, values)
> my_vect <- c("b", "c", "c")
> translated <- my_dict$find(my_vect)
> translated
[1] "B" "C" "C"

要从使用read.table获得的表格构建字典,必须使用stringsAsFactors = FALSE的{​​{1}}选项,否则会发生奇怪的事情(请参阅{{3的评论中的讨论}})。

答案 1 :(得分:0)

您是否尝试过stringr包中的str_replace_all函数?

假设您有一个包含dict列和original列的词典数据框replacement。以下代码替换了向量中替换的所有原始实例。

library(stringr)
translations <- setNames(dict$replacement, dict$original)
new_vect <- str_replace_all(vect, fixed(translations))

我不确定它是否实现了散列,但底层表达式是来自stringi包的C代码,所以它应该很快。

如果original中的某些字词包含original中的其他字词,则唯一不会按原样运作的情况。在这种情况下,您需要将正则表达式start-string(^)或end-string($)标记添加到要替换的原始字符串中。

translations <- setNames(dict$replacement, paste0("^", dict$original, "$"))