2017-05-12 40 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