2014-10-06 20 views
0

我發佈我的問題與一個可重複的例子。問題:使用Shiny時,我無法通過ddply報告不同因素間的平均收縮壓,即吸菸,性別等。我可以在RStudio中生成相應的輸出,但在使用Shiny時無法使用按因子級別報告特定值的函數。ddply,閃亮和不正確的彙總輸出

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

用我閃亮的應用程序,用戶首先上傳.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,輸入$ histVar,並輸入$ histDensityVarFactor一個數據幀。 *注:此數據幀的結構是相同的如實施例*

數據幀創建中GGPLOT2數據,就好了的曲線圖。然後,我將按照因子級別創建一個數值變量的彙總表,一切都很順利。

我正在使用閃亮的代碼是這樣的:

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 

我的問題很簡單:如何通過因子的水平得到我的數值變量的均值和標準差?獲得報告的均值和標準差是整個樣本的均值和標準差。

任何幫助將不勝感激。先謝謝你。 Nathan

+0

與其使用'summarize()',我建議您手工構建數據框架 - 然後從光照輸入到變量名稱更容易。 – hadley 2014-10-20 20:09:34

+0

謝謝。我能夠使用我將在答案中提供的代碼來工作 – nate 2015-08-14 19:25:53

回答

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