我正在尝试创建一个有效的 table() 计算(获取向量中每个值的频率)。与普通的 table() 函数不同的是,它需要支持在不重新计算整个表的情况下添加和删除值。
我想到了使用哈希表。for add:查找键,将值加 1。for remove:寻找钥匙。如果找到:从值中减去 1,如果未找到:添加 value=1 的新键。
我想知道你们是否还有其他想法。
例子:
X
key freq
1 3
2 5
3 2
8 1
remove(8)
key freq
1 3
2 5
3 2
add(2)
key freq
1 3
2 6
3 2
任何有效实施的想法?提前致谢!
- 编辑 -
我目前的代码,如果有人感兴趣的话(还涉及香农熵的计算)
create.freq.hash<-function(x)
{
t<-table(x)
h<-hash(names(t),as.numeric(t));
return(h);
}
freq.hash.add<-function(hash,key)
{
if(is.null(hash[[key]]))
{
.set(hash,key,+1)
}
else
{
.set(hash,key,hash[[key]]+1)
}
}
freq.hash.remove<-function(hash,key)
{
if(!is.null(hash[[key]]))
{
if(hash[[key]]==1)
del(key,hash)
else
.set(hash,key,hash[[key]]-1)
}
}
hash.entropy<-function(hash)
{
if(is.empty(hash))
return;
v<-values(hash);
v.prob<-v/sum(v);
entropy = (-1)*(v.prob%*%log2(v.prob))
return(entropy)
}