【问题标题】:ddply, Shiny, and incorrect summary outputddply、Shiny 和不正确的摘要输出
【发布时间】:2014-12-01 07:48:59
【问题描述】:

我用一个可重复的例子发布我的问题。问题:使用 Shiny 时,我无法让 ddply 报告不同因素(即烟草使用、性别等)的平均收缩压。我可以在 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 的响应式数据帧中。当用户在我的直方图选项卡上时,他们选择一个数字变量 (input$histVar) 和一个因子变量 (input$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

我的问题很简单:如何通过因子的水平获得数值变量的均值和标准差?报告的均值和标准差是整个样本的均值和标准差。

任何帮助将不胜感激。先感谢您。最好的,内森

【问题讨论】:

  • 我建议您手动构建数据框,而不是使用summarise() - 这样从闪亮的输入到变量名会更容易。
  • 谢谢。使用我将在答案中放入的代码,我能够得到一些工作

标签: r shiny plyr


【解决方案1】:
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")

【讨论】:

    猜你喜欢
    • 2020-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-19
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    相关资源
    最近更新 更多