2014-07-04 50 views
0

這裏不包括NA爲樣本數據:預乘以中的R

set.seed(123) 
covar1 <- matrix(sample(c(NA, 1:3), 10, replace = TRUE), 10,1) 
covar2 <- matrix(sample(c(NA, 1:3), 10, replace = TRUE), 10,1) 
covar3 <- matrix(sample(c(NA, 1:3), 10, replace = TRUE), 10,1) 
covar4 <- matrix(sample(c(NA, 1:3), 10, replace = TRUE), 10,1) 
covar5 <- matrix(sample(c(NA, 1:3), 10, replace = TRUE), 10,1) 

df <- as.data.frame(cbind(covar1,covar2,covar3,covar4,covar5)) 
names(df) <- c("covar1","covar2","covar3","covar4","covar5") 

而這些是我的3點的模型與參數每個coresponding到協變量如df

model0 <- data.frame(covar1=4,covar5=7) 
model1 <- data.frame(covar1=2,covar3=5,covar4=3) 
model2 <- data.frame(covar1=2,covar2=5,covar3=3,covar5=7) 

現在,我想選擇model0-2並與df對應的行前乘。不符合匹配標準的df行將給予NA

的目的是始終使用3可用的最長的模型。因此,如果行匹配4協變模型= model2,那麼df行應該與模型2預乘,如果不匹配的話應該嘗試模型1或模型0的短路。

所需的輸出:

 covar1 covar2 covar3 covar4 covar5 Output Model 
1  NA  2  3  NA  NA  NA 
2  1  NA  2  2  2  18 m1 # (1*2)+(2*5)+(2*3)=18 
3  3  1  2  1  1  21 m2 # (1*3)+(1*5)+(3*2)+(7*1)=21 
4  NA  1  NA  3  2  NA   # (1*2)+(2*5)+(2*3)=18 
.. 
.. 

現在,我不打算寫什麼,我都試過,因爲這將包括更多的信息,通常這樣用戶不喜歡。對於這樣的事情,甚至可能會打包在那裏。任何暗示或幫助非常感謝。

回答

2

首先,在製作一個data.frame時,不要用這個as.data.frame/cbind的組合。只需使用

df <- data.frame(covar1,covar2,covar3,covar4,covar5) 

這也將設置適當的名字。我不確定人們採用cbind的方法,但這不是一個好習慣。

無論如何,解決您的實際問題。最好將模型存儲在列表中(最長到最短)。這將會使處理更容易

models <- list(m2=model2, m1=model1, m0=model0) 

現在,我們可以通過數據幀做,看看哪個模型具有非缺失協變量值的最重疊。首先,我calcualte重疊,然後選擇每行

mmatch <- sapply(models, function(m) rowSums(!is.na(df[,names(m)]))/ncol(m)) 
wmodel <- apply(mmatch,1,which.max) 

的最佳模式現在我知道每個組的最佳模式(當然,特別是它在車型列表索引)我會分裂基於data.frame在最佳匹配上,進行乘法運算,然後重新加入數據。

out<-unsplit(Map(function(m,d,n) 
    {cbind(d, Output=rowSums(d[,names(m)]*m[1,,drop=T], na.rm=T), 
     Model=n, stringsAsFactors=F) 
    }, 
    models, 
    split(df, wmodel), 
    names(models)), 
wmodel) 

這將返回

covar1 covar2 covar3 covar4 covar5 Output Model 
1  1  3  3  3  NA  26 m1 
2  3  1  2  3  1  24 m2 
3  1  2  2  2  1  25 m2 
4  3  2  3  3  1  32 m2 
5  3  NA  2  NA  NA  NA m1 
6  NA  3  2  1  NA  NA m1 
7  2  NA  2  3  NA  23 m1 
8  3  NA  2  NA  1  19 m0 
9  2  1  1  1  1  19 m2 
10  1  3  NA  NA  3  25 m0 

我不知道所需的輸出顯示你實際使用您指定的,因爲我得到了不同的值的種子。

+0

有趣的做法,我學到了很多東西,謝謝! – Maximilian