gpt4 book ai didi

r - 我怎样才能重写这段代码,以便它按预期使用 plyr/ddply?

转载 作者:行者123 更新时间:2023-12-04 15:59:40 26 4
gpt4 key购买 nike

背景

我有一个概率分布数据框,我想计算以下方面的统计摘要:

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

方法

第 1 步:我编写了一个函数来计算摘要并返回 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 = ''))
}

第 2 步:我想在我的数据框中添加一个名为 stats

的新列
priors$stats <- ddply(priors, 
.(name, distn, parama, paramb),
function(x) summary.stats(x$distn, x$parama, x$paramb))$V1

问题 1:

正确的做法是什么?尝试时出现错误

                ddply(priors, 
.(name, distn, parama, paramb),
transform,
stats = function(x) summary.stats(x$distn, x$parama, x$paramb))

问题 2:(加分项)

是否有更有效的方法来编写 summary.stats 函数,即使用更少的“if”?

更新

感谢 Shane 和 Joshua 为我解决了这个问题。

我还发现了一个问题,应该对其他人有帮助 do a plyr operation on every row of a dataframe

最佳答案

这是使用 switch 代替的 summary.stats 的清理版本。我还在输出中添加了名称“stats”,因为这似乎是让您失望的原因。

summaryStats <- function(distn, A, B) {
CI <- c(0.05, 0.95)
FUN <- get(paste("q",distn,sep=""))
ans <- switch(distn,
gamma = A*B,
lnorm = exp(A + 1/2 * B^2),
beta = A/(A+B),
weibull = mean(rweibull(10000,A,B)),
norm = A)
ans <- c(ans, FUN(CI, A, B))
ans <- (signif(ans, 2))
out <- c(stats=paste(ans[1], ' (', ans[2], ', ', ans[3],')', sep=''))
return(out)
}

我不确定如何用 plyr 做到这一点,但你可以像这样用无聊的 ol' sapply 来做到这一点:

priors$stats <- sapply(1:nrow(priors),
function(i) with(priors[i,], summaryStats(distn, parama, paramb) ))

关于r - 我怎样才能重写这段代码,以便它按预期使用 plyr/ddply?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4403583/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com