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

时间:2017-08-14 14:20:56

标签: r

我想根据同一组中的观察数量(ID)为我的观察分配相等的权重,即frac_weight = 1 / count(相同的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

从我的data.frame

中挑出ID列

谢谢, Wilhelm Fantastisch。

2 个答案:

答案 0 :(得分:1)

尝试功能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)

答案 1 :(得分:0)

该应用程序似乎非常适合以某种方式使用table

它使用了比Rui Barradas更多的一句话:

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