2017-08-14 95 views
-1

欲相等的權重分配給基於在同一組中的觀察(ID)的數目我的觀察,即frac_weight = 1 /數(同一ID)基於R中重複計算串計算分數權重

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列

感謝, 威廉Fantastisch。

回答

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) 
0

的應用似乎非常適合以某種方式使用table

它使用一個更比線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 
+0

謝謝你們,這個工作最終FundID_vec < - as.character(DAT $ FundID) frac_weight < - as.numeric(AVE( FundID_vec,FundID_vec,FUN = function(x)1/length(x))) –