我發佈我的問題與一個可重複的例子。問題:使用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
與其使用'summarize()',我建議您手工構建數據框架 - 然後從光照輸入到變量名稱更容易。 – hadley 2014-10-20 20:09:34
謝謝。我能夠使用我將在答案中提供的代碼來工作 – nate 2015-08-14 19:25:53