根据值的出现频率分配权重

| 我想请教我有关数据框的问题。它是多个阶段的向量,每个阶段都有变量的名称。可以说
vec<-data.frame(phase1= c(\"var1\",\"var2\",\"var3\",\"var4\",\"var5\",\"var6\"),     
                 phase2= c(\"var1\",\"var3\",\"var4\",\"var2\",\"var6\",\"var5\"),    
                 phase3= c(\"var4\",\"var3\",\"var2\",\"var1\",\"var6\",\"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
    

要回复问题请先登录注册