R中的散列列表,在给定值(向量)的情况下恢复密钥

时间:2013-10-09 19:36:25

标签: r hash k-means

我正在研究在R中实施k-Means。

我从单个文件中获取我的特征向量并将它们全部放入一个我称之为“holder”的包中:

holder[[filename]] <- c(featureVector)

如果我写的话,我可以恢复给定的特征向量:

holder[["file3453.txt"]]holder[[number]]

我将使用特征向量进行质心和其他一些计算,所以假设我有一个特征向量V,如何从持有者那里获取文件的名称?

这个问题也可以解释为:

给定值(特征向量)如何确定密钥(文件名)?

3 个答案:

答案 0 :(得分:2)

扩展nograpes的解决方案。如果要构建反向映射,可以执行以下操作:

#this function converts a feature vector
#there may be other, better ways to do that, but this one is simple.
#it works best when your feature vectors are short and contain integers
#it may not work at all due to precision issues for real numbers
my.to.string = function(x) paste(x,collapse="_")  

在构建持有人矢量时,请执行以下操作:

holder[[filename]] = featureVector   #updates the holder
reverseMap[[my.to.string(featureVector)]] = filename   # updates the reverse map

现在 - 完成任务

my.file = reverseMap[[my.to.string(my.feature)]]

这很简单,适用于简单的情况。它不能取代我尚未见过或不需要R的真正基于哈希码的数据结构。

答案 1 :(得分:2)

但是为什么首先要丢失标签和矢量之间的连接需要反向查找?只要把它们放在一起,你就不会遇到这个问题:

library(data.table)

dt = data.table(filename = c('a', 'b'), feature = list(c(1,2,3), c(2,3,4)))
dt
#   filename feature
#1:        a   1,2,3
#2:        b   2,3,4

# possibly set the key to filename for fast access
setkey(dt, filename)
dt['a']    # this does a fast binary search lookup in data.tables

# modify the feature in some way for each filename:
dt[, feature := awesome_func(feature), by = filename]

# etc

答案 2 :(得分:1)

你应该知道列表不是用R中的散列表实现的。另外,没有有效的方法可以做你想要的,你要么必须维护反向查找列表,要么只扫描匹配的索引。例如,

# Test data.
holder<-list(`file1`=c(1,0,1,0),`file2`=c(1,1,1,1),`file3`=c(1,0,1,0))
# Find this feature.
feature<-c(1,0,1,0)
# Find all indices that have this feature vector.
names(holder)[sapply(holder,function(x)all(x==feature))]