2017-05-12 41 views
0

我想用不同函數產生的值填充空矩陣的每一列。我想使用許多功能,所以速度很重要。我已經準備了一個我想做的事情的小例子,但我做不到。用不同函數的輸出值填充矩陣的列

我有一個空矩陣,我想通過函數的輸出值填充每列。這個矩陣中的列的一個確切的數字,每一列都有特定的名稱:

mat<-matrix(ncol = 4) 
colnames(mat)<-c("binomial","normal","gamma","exponential") 

然後,考慮矢量包含該矩陣的一些colnames:

remove<-c("gamma","exponential") 

我想填補這個矩陣的列由每個分佈產生的隨機值,但在這種情況下,如果移除對象包含此矩陣的列名稱,則必須移除它們,而不是計算它們。 我寫這樣的:

mat<-mat[,-which(colnames(mat) %in% remove) ] 

mat[,1]<-rnbinom(10, mu = 4, size = 1) 
mat[,2]<-rnorm(10) 
mat[,3]<-rgamma(10, 0.001) 
mat[,4]<-rexp(10) 

我尋找,最後矩陣是這樣的:

binomial normal 
1 -0.54948696 
6 -0.53396115 
1 0.69918478 
13 0.92824442 
0 0.03331125 

我將是你的幫助非常感謝。

回答

1

這是一個構造函數的方法。隨機生成器存儲在一個列表中,然後將它們的子集(那些未被刪除的)提供給sapply

randMatGet <- function(sampleSize=10, remove=NULL) { 
    randFuncs <- list("binomial"=function(x) rnbinom(x, mu=4, size=1), 
        "normal"=function(x)rnorm(x), 
        "gamma"=function(x) rgamma(x, 0.001), 
        "exponential"=function(x) rexp(x)) 

    sapply(randFuncs[setdiff(names(randFuncs), remove)], function(f) f(sampleSize)) 
} 

現在,調用函數

set.seed(1234) 
randMatGet() 
     binomial  normal   gamma exponential 
[1,]  0 0.375635612 0.000000e+00 1.45891992 
[2,]  1 0.310262167 0.000000e+00 1.43920743 
[3,]  1 0.005006950 3.099691e-294 2.76404158 
[4,]  5 -0.037630263 7.540715e-249 0.02316716 
[5,]  0 0.723976061 0.000000e+00 0.89394340 
[6,]  0 -0.496738863 0.000000e+00 3.68036715 
[7,]  0 0.011395161 0.000000e+00 2.90720399 
[8,]  4 0.009859946 9.088837e-34 0.13015222 
[9,]  10 0.678271423 0.000000e+00 0.81417829 
[10,]  0 1.029563029 0.000000e+00 2.01986489 

,然後用刪除

# reset seed for comparison 
set.seed(1234) 
randMatGet(remove=remove) 
     binomial  normal 
[1,]  0 0.375635612 
[2,]  1 0.310262167 
[3,]  1 0.005006950 
[4,]  5 -0.037630263 
[5,]  0 0.723976061 
[6,]  0 -0.496738863 
[7,]  0 0.011395161 
[8,]  4 0.009859946 
[9,]  10 0.678271423 
[10,]  0 1.029563029 

要允許不同參數的調整,改變功能如下。這是對rbinom mu參數的一個例子。

randMatGet <- function(sampleSize=10, remove=NULL, mu=4) { 
    randFuncs <- list("binomial"=function(x) rnbinom(x, mu=mu, size=1), 
        "normal"=function(x)rnorm(x), 
        "gamma"=function(x) rgamma(x, 0.001), 
        "exponential"=function(x) rexp(x)) 

    sapply(randFuncs[setdiff(names(randFuncs), remove)], function(f) f(sampleSize)) 
} 

現在,你可以做randMatGet(mu=1)

+0

真的很感激你的時間和你的答案。我把它開發成像sapply這樣的工作(randFuncs [setdiff(names(randFuncs),except)],function(f)f(n,y)),並返回list()。我做錯了什麼? @lmo – minoo

+0

我的意思是說,如果我有兩個像sampleSize和mu的參數。那會怎麼樣? – minoo

+0

請參閱我的帖子底部的修改。 – lmo