代码之家  ›  专栏  ›  技术社区  ›  Wilhelm Fantastisch

基于R中的重复计数字符串计算分数权重

r
  •  -1
  • Wilhelm Fantastisch  · 技术社区  · 7 年前

    我希望根据同一组(ID)中的观察值数量为我的观察值分配相等的权重,即分数加权=1/计数(相同ID)

    ID          frac_weight
    FSGBR070N3  0.333333333
    FSGBR070N3  0.333333333
    FSGBR070N3  0.333333333
    FS00008L4G  1
    FS00008VLD  0.333333333
    FS00008VLD  0.333333333
    FS00008VLD  0.333333333
    FS00009SQX  0.5
    FS00009SQX  0.5
    FSUSA0A1KW  0.5
    FSUSA0A1KW  0.5
    FSUSA0A1KX  1
    FSUSA0A1KY  1
    FS0000B389  0.5
    FS0000B389  0.5
    FSUSA09AX9  1
    

    ID_vec <- dat$ID
    

    从我的数据中挑出ID列。框架

    谢谢

    2 回复  |  直到 7 年前
        1
  •  1
  •   Rui Barradas    7 年前

    Try函数 ave

    ID_vec <- dat$ID
    
    frac_w <- as.numeric(ave(ID_vec, ID_vec, FUN = function(x) 1/length(x)))
    all.equal(dat$frac_weight, frac_w)
    [1] TRUE
    

    重要提示: 如果 class(dat$ID) 退货 factor 你必须这样做

    ID_vec <- as.character(dat$ID)
    
        2
  •  0
  •   KenHBS    7 年前

    该应用程序似乎非常适合使用 table 在某种程度上。

    inds <- sapply(df$ID, function(x){which(names(table(df$ID)) == x)})
    
    1/(table(df$ID)[inds])
    # FSGBR070N3 FSGBR070N3 FSGBR070N3 FS00008L4G FS00008VLD FS00008VLD FS00008VLD 
    # 0.3333333  0.3333333  0.3333333  1.0000000  0.3333333  0.3333333  0.3333333 
    # FS00009SQX FS00009SQX FSUSA0A1KW FSUSA0A1KW FSUSA0A1KX FSUSA0A1KY FS0000B389 
    # 0.5000000  0.5000000  0.5000000  0.5000000  1.0000000  1.0000000  0.5000000 
    # FS0000B389 FSUSA09AX9 
    # 0.5000000  1.0000000