我想根据同一组中的观察数量(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。
答案 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