2010-10-01 6 views
1

J'ai un dataframe:comment échantillonner les distributions, donné n, le nom de la distribution et les paramètres dans une base de données?

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

et je voudrais prendre n échantillons de la distribution avec des paramètres a et b.

J'ai écrit cette fonction:

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

Je voudrais savoir:

  1. est-il une meilleure approche?
  2. Comment utiliser l'une des fonctions d'application pour exécuter cette fonction sur chaque ligne?
  3. dois-je convertir la trame de données en une matrice pour ce faire?

Merci d'avance!

+2

Un autre candidat à la fortune (106) ... –

+0

> fortune (106) Si la réponse est parse() vous devriez d'habitude repenser la question. - Thomas Lumley R-help (février 2005) –

Répondre

2

voir? Do.call

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

l'aide d'une applique est difficile, comme vous avez le caractère mixte et des vecteurs numériques dans votre dataframe. L'utilisation de apply sur les lignes vous donnera des vecteurs de caractères, ce qui provoquera des erreurs. La conversion en une matrice donnera une matrice de caractères. Je ferais quelque chose comme:

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

Alternativement, la solution de Joshua est plus propre:

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

Ou vous pouvez utiliser à nouveau 'do.call':' spply (1: nrow (prieurs), function (x) do.call (pr.samp, as.list (prieurs [x,]))) ' –

+0

@Joshua: merci pour le pointeur –

+0

Merci Joris et Joshua! –

Questions connexes