通过不同函数的输出值填充矩阵的列

时间:2017-05-12 15:22:13

标签: r loops if-statement matrix

我想用不同函数产生的值填充空矩阵的每一列。我想使用很多功能,因此速度很重要。我准备了一个我想做的小例子,但我做不到。

我有一个空矩阵,我希望用函数输出的值填充每一列。此矩阵具有精确的列数,每列具有特定名称:

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

然后,考虑包含该矩阵的一些共同名的向量:

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

我希望通过每个分布产生的随机值填充此矩阵的列,但在这种情况下,如果remove对象包含此矩阵的列名,则必须删除它们而不进行计算。 我写了这个:

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 个答案:

答案 0 :(得分: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)