如何解决根据值的出现频率分配权重
| 我想请教我有关数据框的问题。它是多个阶段的向量,每个阶段都有变量的名称。可以说vec<-data.frame(phase1= c(\"var1\",\"var2\",\"var3\",\"var4\",\"var5\",\"var6\"),phase2= c(\"var1\",\"var6\",\"var5\"),phase3= c(\"var4\",\"var1\",\"var5\"))
vec
phase1 phase2 phase3
1 var1 var1 var4
2 var2 var3 var3
3 var3 var4 var2
4 var4 var2 var1
5 var5 var6 var6
6 var6 var5 var5
现在,假设我们对前三行感兴趣,因此其中三行的权重为1/3,否则为零。我的函数理想情况下将输出sth:
phase1 phase2 phase3
var1 0.33 0.33 0
var2 0.33 0 0.33
var3 0.33 0.33 0.33
var4 0 0.33 0.33
var5 0 0 0
var6 0 0 0
该功能还应该适用于前4、5或全部6行(即权重将随之变化)。
问候,
亚历克斯
解决方法
我相信您正在寻找:
n<-3
l<-dim(vec)[1]
wghts<-c(rep(1/n,n),rep(0,l-n))
result<-do.call(cbind,lapply(vec,function(curcol){
wghts[match(curcol,vec$phase1)]
}))
如果需要,您可以添加:
rownames(result)<-vec$phase1
, 您可以使用%in%
查找匹配项,并使用ifelse
设置匹配项:
set_weigth <- function(x,v,w) ifelse(x%in%v,w,0)
as.data.frame(lapply(vec,set_weigth,v=vec$phase1[1:3],w=0.33))
, 您实际上是在phase_i
中设置var_i
的权重,因为在phase_i
中出现行var_i
的比例。最简单的方法是使用table()
函数:给定离散值向量,它将产生不同值的频率计数。如果要基于数据帧vec
的前三行获得所需的权重,则只需执行以下操作:
> sapply(vec[1:3,],table)/3
phase1 phase2 phase3
var1 0.3333333 0.3333333 0.0000000
var2 0.3333333 0.0000000 0.3333333
var3 0.3333333 0.3333333 0.3333333
var4 0.0000000 0.3333333 0.3333333
var5 0.0000000 0.0000000 0.0000000
var6 0.0000000 0.0000000 0.0000000
同样,如果要使用前4行,请执行以下操作:
> sapply(vec[1:4,table)/4
phase1 phase2 phase3
var1 0.25 0.25 0.25
var2 0.25 0.25 0.25
var3 0.25 0.25 0.25
var4 0.25 0.25 0.25
var5 0.00 0.00 0.00
var6 0.00 0.00 0.00
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。