R中执行以下操作的有效且简单的方法是什么:
我认为hash package会帮助我做到这一点,但我不确定我是否正确执行了第3步。
说我的初始向量是my_vect
,我的哈希是my_dict
我尝试了以下方法:
values(my_dict, keys=my_vect)
以下观察让我怀疑我是以正确的方式做到这一点:
my_vec
导致某些内容看起来不均匀:my_vec
显示为“数字索引”(我的意思是方括号之间的整数出现在值的一侧)在交互式控制台中显示数据),如上所述调用values
的结果看起来仍然看起来像字典:每个显示的翻译值都具有显示在其上方的原始值(即散列键)。我只想要价值观。如果我理解正确,R有一些方法可以使用“名称”代替向量的数字索引,而我使用values
函数获得的是带有名称的向量。它似乎适用于我想做的事情,虽然我想它需要的内存比必要的多。
答案 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, "$"))