Как сэмплировать распределения, данные, имя дистрибутива и параметры в кадре данных? - PullRequest
1 голос
/ 02 октября 2010

У меня есть датафрейм:

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)
                     )

и я хотел бы взять n выборок из распределения с параметрами a и b.

Я написал эту функцию:

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

Хотелось бы знать:

  1. есть ли лучший подход?
  2. как бы я использовал одну из функций применения для запуска этого в каждой строке?
  3. Должен ли я конвертировать массив данных в матрицу, чтобы сделать это?

Заранее спасибо!

1 Ответ

2 голосов
/ 02 октября 2010

см. Do.call

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

Использовать приложение сложно, так как в вашем фрейме данных есть смешанные символьные и числовые векторы.Использование apply для строк даст вам символьные векторы, что приведет к ошибкам.Преобразование в матрицу даст матрицу символов.Я бы сделал что-то вроде:

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

Альтернативно, решение Джошуа чище:

sapply(1:nrow(priors), function(x) do.call(pr.samp,as.list(priors[x,])))
...