ddply,Shiny和不正确的摘要输出

时间:2014-10-06 23:57:56

标签: r shiny plyr

我发布了一个可重现的例子。问题:当使用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。

非常感谢任何帮助。先感谢您。最好的,内森

1 个答案:

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