【问题标题】:Shiny calculate the mean of columns in dataframe闪亮计算数据框中列的平均值
【发布时间】:2016-09-16 23:01:55
【问题描述】:

我正在尝试计算数据框中所有列的平均值,但出现错误:参数不是数字或逻辑:返回 NA。 这是我正在使用的代码:

UI.R

library(shiny)
library(shinydashboard)
library(plyr)
library(reshape2)

#library(data.table)

shinyUI(pageWithSidebar(
  headerPanel("CSV Viewer"),
  sidebarPanel(
    fileInput('file1', 'Choose CSV File',
              accept=c('text/csv', 'text/comma-separated-values,text/plain', '.csv'))


  ),
  mainPanel(

    tableOutput('data'),
    verbatimTextOutput('mean')

  )
))

server.UI

shinyServer(function(input, output,session) {

  output$data <- renderTable({
    inFile <- input$file1

    if (is.null(inFile))
      return(NULL)

    data<-data.frame(read.csv(inFile$datapath, header=FALSE, sep=";"))

  })
  output$mean<-renderPrint({

   mean(data)

  })
})

我完全迷失了,我无法找出错误。请帮我。谢谢。

【问题讨论】:

  • 我没有仔细查看您的代码,但您正在尝试获取 data.frame 对象的平均值。查看?mean 它表明数据帧不支持该功能。如果你想要一个特定的列意味着尝试mean(data$MY_COL)
  • 它仍然无法正常工作.. 还有其他方法可以计算数据帧的平均值吗?
  • 数据框是什么意思?你想要数据框中每个值的平均值吗?你想要每列的平均值吗?每一行?还有什么?您打算如何处理分类变量?日期?其他非数字值?
  • 我想要每一列的平均值,除了包含日期的列
  • lapply(data, function(x) {if(is.numeric(x)) return(mean(x); return(NA)}) 怎么样。

标签: r dataframe shiny mean


【解决方案1】:

您可以使用“colMeans(.)”命令计算数据框每一列的平均值。它返回一个向量,其每个元素都是数据框中每一列的平均值。

【讨论】:

    【解决方案2】:

    好的,所以你的主要问题是你试图取数据框的平均值,而使用mean() 函数是不可能的。这段代码应该可以工作(请注意,因为您没有提供任何示例数据,所以我做了一些 - 我在其中输入了一个日期列,并且该函数没有取其平均值)。

    shinyServer(function(input, output,session) {
    
      dataset <- reactive({
        #Change the below line
        data.frame(a=c(1,2,3),b=c(2,4,5),c=as.Date(c("12/31/09","12/31/10","12/31/11"),"%m/%d/%y"))
    
      })
    
      output$mean<-renderPrint({
    
       colMeans(dataset()[,which(sapply(dataset(), class) != "Date")])
    
      })
    })
    

    请注意,我调用了dataset(),它允许我引用数据。这应该会给你预期的输出。请注意,我还在数据集中所有不属于Date 类型的列上调用colMeans 函数。您还应该能够用您的数据框定义替换我的。也就是说,在我的代码中,您只需将 data.frame(a=c(1,2,3),b=c(2,4,5),c=as.Date(c("12/31/09","12/31/10","12/31/11"),"%m/%d/%y")) 替换为您在 renderTable() 调用中的代码即可。

    希望这会有所帮助。

    编辑: 根据下面的 cmets,您可以在 renderTable 调用中定义您的数据并在 renderPrint 中引用它。两个主要问题是read.csv() 中数据的定义和尝试在数据帧上调用mean。后一个问题由colMeans() 修复,前者使用来自@Mouna 的代码修复:dataset&lt;-data.frame(read.csv(inFile$datapath, header = FALSE, sep = ";", dec = ","))

    【讨论】:

    • 感谢@mikeyMike 的澄清,但恐怕它仍然无法正常工作,即使使用您创建的数据框,colMeans(dataset()[,which(sapply(df, class) != "Date")]) 仍然存在问题..
    • 很抱歉。我忘了更改一些代码。现在应该修好了,让我知道它是否有效。
    • 非常感谢@mikeyMike,它正在工作!我遇到的问题是在 file.csv 中,所以我不得不更改 read.csv(inFile$datapath, header=FALSE, sep=";")dataset&lt;-data.frame(read.csv(inFile$datapath, header = FALSE, sep = ";", dec = ","))
    • 很高兴能帮上忙。我对 Shiny 比较陌生,实际上并不知道您可以参考来自 renderPrint 的数据。如果您认为我的答案有帮助,请随时单击我的答案旁边的复选框!
    • 完成。非常感谢。
    猜你喜欢
    • 2016-03-03
    • 1970-01-01
    • 1970-01-01
    • 2017-07-07
    • 2021-12-12
    • 2017-12-04
    • 2015-09-10
    相关资源
    最近更新 更多