【问题标题】:filling columns of a matrix by the values of outputs of different functions用不同函数的输出值填充矩阵的列
【发布时间】:2017-10-11 23:36:17
【问题描述】:

我想用不同函数产生的值填充空矩阵的每一列。我想使用很多功能,所以速度很重要。我已经准备了一个小例子来说明我想做的事情,但我做不到。

我有一个空矩阵,我想用函数输出的值填充每一列。这个矩阵有准确的列数,每列都有特定的名称:

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

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

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

非常感谢您的帮助。

【问题讨论】:

    标签: r loops if-statement matrix


    【解决方案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)。

    【讨论】:

    • 非常感谢您的时间和回答。我像这样将它开发到我的工作中 sapply(randFuncs[setdiff(names(randFuncs), except)], function(f) f(n,y)) 并返回 list()。我做错了吗? @lmo
    • 我的意思是,如果我也有两个参数,比如 sampleSize 和 mu。那会怎么样?
    • 非常感谢兄弟。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-06
    • 2020-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-22
    相关资源
    最近更新 更多