1

我有一个数据框:

priors <- data.frame(dist = c('lnorm', 'beta', 'gamma'),
                      a   = c(0.5, 1, 10),
                      b   = c(0.4, 25, 4),
                      n   = c(100, 100, 100)
                     )

我想用参数a和b从分布中抽取n个样本。

我写了这个函数:

pr.samp <- function(n,dist,a,b) {eval (parse ( 
                    text = 
                    paste("r",dist,"(",n,",",a,",",b,")",sep = "")
                    ))}

我想知道:

  1. 有更好的方法吗?
  2. 我将如何使用其中一个应用函数在每一行上运行它?
  3. 我是否必须将数据框转换为矩阵才能做到这一点?

提前致谢!

4

1 回答 1

2

见?do.call

pr.samp <- function(n,dist,a,b) {
    do.call(paste('r',dist,sep=""),list(n,a,b))
}

使用 apply 很困难,因为您在数据框中混合了字符和数字向量。在行上使用 apply 会给你字符向量,这会导致错误。转换为矩阵将给出一个字符矩阵。我会做类似的事情:

sapply(1:nrow(priors),function(x){
  pr.samp(priors$n[x],priors$dist[x],priors$a[x],priors$b[x])})

或者,Joshua 的解决方案更清洁:

sapply(1:nrow(priors), function(x) do.call(pr.samp,as.list(priors[x,])))
于 2010-10-01T22:11:50.870 回答