【问题标题】:Assign weights based on frequency of occurrence of values根据值出现的频率分配权重
【发布时间】:2011-09-04 18:09:14
【问题描述】:

我想就我的数据框向您寻求帮助。它是一个包含多个阶段的向量,并且对于每个阶段,我们都有变量的名称。让我们说

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

现在,假设我们对前 3 行感兴趣,因此其中一个变量的权重是 1/3,否则为零。理想情况下,我的函数会像这样输出:

          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 行(即,权重会随之改变)。 问候, 亚历克斯

【问题讨论】:

    标签: r dataframe frequency


    【解决方案1】:

    您实际上是在 phase_i 中设置 var_i 的权重,因为 var_i 行的分数出现在 phase_i 中。最简单的方法是使用table() 函数:给定一个离散值向量,它会产生不同值的频率计数。如果您想根据数据框vec 的前 3 行获得所需的权重,您只需执行以下操作:

    > 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
    

    【讨论】:

      【解决方案2】:

      您可以使用%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))
      

      【讨论】:

        【解决方案3】:

        我相信您正在寻找这个:

        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
        

        【讨论】:

          猜你喜欢
          • 2020-02-29
          • 2019-11-23
          • 2017-08-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-06-14
          • 1970-01-01
          • 2020-11-21
          相关资源
          最近更新 更多