我发布了一个可重现的例子。问题:当使用Shiny时,我无法报告不同因素的平均收缩压,即烟草使用,性别等。我可以在RStudio中生成适当的输出,但在使用Shiny时无法获得按因子级别报告特定值的功能。
在R中运行的代码示例:
a<- runif(99, 0, 5)
b <- rep(c("A", "B", "C"), 33)
df2<- data.frame(numVar =a, factVar=b)
res<- ddply(df2, .(factVar), summarize,
mean = round(mean(numVar), 2),
sd = round(sd(numVar), 2))
要使用我的Shiny应用程序,用户首先上传.csv文件。然后将该文件拆分为数字和因子变量。然后将变量分别存储在名为passdfnum和passdffact的反应数据帧中。当用户在我的直方图选项卡上时,他们选择一个数字变量(输入$ histVar)和一个因子变量(输入$ histDensityVarFactor)。然后,我在subsetData函数中创建一个临时数据帧dataM,该函数仅使用以下代码包含所选字段:
subsetData <- reactive({
if(input$histDensityVarFactor!= "None"){
dataM <- data.frame(numVar=passdfnum()[input$histVar], factVar=passdffact()[input$histDensityVarFactor])
}
})
这会生成一个包含row.names,input $ histVar和input $ histDensityVarFactor的数据框。 *注意:此数据帧的结构与示例*
中的数据帧相同我在ggplot2中创建了一个数据图表,很好。然后我按因子水平创建一个数值变量的汇总表,一切都顺利。
我在Shiny中使用的代码是:
output$histMeans<-renderPrint({
if(input$histDensityVarFactor!= "None"){
numVar<-noquote(names(passdfnum()[input$histVar]))
factVar<-noquote(names(passdffact()[input$histDensityVarFactor]))
res<- ddply(dataM, .(dataM[[factVar]]), here(summarize),
mean = round(mean(dataM[[input$histVar]]), 2),
sd = round(sd(dataM[[numVar]]), 2))
res }})
输出结果如下: 注意:因子变量编码为是/否或高/中/低
dataM[[factVar]] mean sd
1 No 127.55 15.31
2 Yes 127.55 15.31
一个有趣的说明:如果我使用input$histDensityVarFactor
代替.(dataM[[factVar]])
,例如:
res<- ddply(dataM, input$histDensityVarFactor, here(summarize),
mean = round(mean(dataM[[input$histVar]]), 2),
sd = round(sd(dataM[[numVar]]), 2))
res
我得到了这个输出:
tobacco mean sd
1 No 127.55 15.31
2 Yes 127.55 15.31
我的问题很简单:如何通过因子的水平得到我的数值变量的均值和sd?报告的平均值和sd是整个样本的平均值和sd。
非常感谢任何帮助。先感谢您。最好的,内森
答案 0 :(得分:0)
tmp <- aggregate(dataM[[numVar]]~dataM[[factVar]], dataM, FUN=function(x) { c(n=noquote(sprintf("%.0f",length(x))), mean=noquote(sprintf("%.4f", mean(x))), sd=noquote(sprintf("%.4f", sd(x))), se=noquote(sprintf("%.4f", (sd(x)/length(x)))))})
tmp<- cbind(tmp[1][1], tmp[2][,1])
names(tmp) <- c(noquote(input$histDensityVarFactor), "N", "Mean", "SD", "SE")