【发布时间】: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()- 这样从闪亮的输入到变量名会更容易。 -
谢谢。使用我将在答案中放入的代码,我能够得到一些工作