我正在研究在R中实施k-Means。
我从单个文件中获取我的特征向量并将它们全部放入一个我称之为“holder”的包中:
holder[[filename]] <- c(featureVector)
如果我写的话,我可以恢复给定的特征向量:
holder[["file3453.txt"]]
或holder[[number]]
。
我将使用特征向量进行质心和其他一些计算,所以假设我有一个特征向量V,如何从持有者那里获取文件的名称?
这个问题也可以解释为:
给定值(特征向量)如何确定密钥(文件名)?
答案 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))]