ContexteComment puis-je réécrire ce code afin qu'il utilise plyr/ddply comme prévu?
J'ai dataframe des distributions de probabilité que je voudrais calculer des résumés statistiques pour:
priors <- structure(list(name = c("theta1", "theta2", "theta3", "theta4",
"theta5"), distn = c("gamma", "beta", "lnorm", "weibull", "gamma"),
parama = c(2.68, 4, 1.35, 1.7, 2.3), paramb = c(0.084, 7.2, 0.69, 0.66, 3.9),
another_col = structure(c(3L, 4L, 5L, 1L, 2L
), .Label = c("1", "2", "a", "b", "c"), class = "factor")),
.Names = c("name", "distn", "parama", "paramb", "another_col"), row.names = c("1",
"2", "3", "4", "5"), class = "data.frame")
approche
Étape 1: J'ai écrit une fonction pour calculer la sommaires et retour mean(lcl, ucl)
summary.stats <- function(distn, A, B) {
if (distn == 'gamma' ) ans <- c(A*B, qgamma(c(0.05, 0.95), A[ ], B))
if (distn == 'lnorm' ) ans <- c(exp(A + 1/2 * B^2), qlnorm(c(0.05, 0.95), A, B))
if (distn == 'beta' ) ans <- c(A/(A+B), qbeta(c(0.05, 0.95), A, B))
if (distn == 'weibull') ans <- c(mean(rweibull(10000,A,B)), qweibull(c(0.05, 0.95), A, B))
if (distn == 'norm' ) ans <- c(A, qnorm(c(0.05, 0.95), A, B))
ans <- (signif(ans, 2))
return(paste(ans[1], ' (', ans[2], ', ', ans[3],')', sep = ''))
}
Étape 2: Je voudrais ajouter une nouvelle colonne à mon dataframe appelé stats
priors$stats <- ddply(priors,
.(name, distn, parama, paramb),
function(x) summary.stats(x$distn, x$parama, x$paramb))$V1
Question 1:
quelle est la bonne façon de le faire? Je reçois une erreur lorsque je tente
ddply(priors,
.(name, distn, parama, paramb),
transform,
stats = function(x) summary.stats(x$distn, x$parama, x$paramb))
Question 2: (crédit supplémentaire)
est-il un moyen plus efficace de coder la fonction summary.stats
, à savoir, avec moins « si ce »?
mise à jour
Merci à Shane et Joshua pour cette compensation pour moi.
Je trouve aussi une question qui devrait être utile pour les autres essayant de do a plyr operation on every row of a dataframe
Je pense qu'il veut que le nouveau nom de colonne soit "stats". J'ai ajouté cela à ma version de sa fonction. –
@Shane, merci pour votre réponse.Ce que je suis confus sur est comment obtenir 'ddply' pour sortir une seule colonne que je peux assigner à une nouvelle colonne dans les priors, par exemple. 'priors $ stats <- ddply (....) $ V1'; Je suppose que l'utilisation de 'ddply() $ V1' n'est pas correcte. L'élément de données «priors» «priors» a d'autres colonnes que je voudrais conserver sans avoir à toutes les spécifier dans 'ddply()'. –
@David Exécutez mon code. 'ddply' * fait * ça automatiquement. – Shane