2011-05-30 49 views
2

我想請你幫忙解決我的數據框問題。它是一個有許多階段的向量,每個階段我們都有變量名稱。可以說根據值的出現頻率分配權重

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行(即權重會改變然後)是適用的。 問候, 亞歷

回答

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

Y ou基本上將var_i的權重設置爲phase_i,因爲行var_i的分數出現在phase_i中。最簡單的方法是使用table()函數:給定一個離散值向量,它會生成不同值的頻率計數。如果您想根據第3行中的數據幀vec的得到你想要的權重,你根本:

> 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