【问题标题】:R computing mean, median, variance from file with frequency distributionR计算具有频率分布的文件的平均值,中位数,方差
【发布时间】:2014-05-03 21:07:41
【问题描述】:

我对 R 工具非常陌生,我的问题可能有点太明显了。

我有一个包含以下数据的文件:

Score     Frequency

 100         10

 200         30

 300         40

如何读取此文件并计算平均值、中位数、方差和标准差?

如果上表只是没有任何频率信息的原始分数,那么我可以这样做:

x

中位数(x)

等等,但我无法理解在给定频率表时如何进行这些计算。

【问题讨论】:

    标签: r statistics


    【解决方案1】:

    按照您手动完成的方式进行:

    设 s 为分数向量,f 为频率向量。

    Sx = sum(s*f)
    Sx2 = sum((s^2)*f)
    n = sum(f)
    theMean = Sx/n
    SSx = Sx2 - n*theMean^2
    sVar = SSx/(n-1)
    ssd = sqrt(sVar)
    

    这避免了使用代表,当数字很大时很麻烦。

    【讨论】:

      【解决方案2】:

      使用read.table 读取数据(读取?read.table 以从文件中读取)。然后,通过创建单个分数的向量来扩展数据。然后我们可以编写一个函数来获取所需的统计信息。如果您不想编写函数,当然可以单独计算每个。

      d <- read.table(header = TRUE, text = "Score     Frequency
       100         10
       200         30
       300         40")
      
      d2 <- rep(d$Score, d$Frequency)  ## expands the data by frequency of score
      
      multi.fun <- function(x) {
          c(mean = mean(x), median = median(x), var = var(x), sd = sd(x))
      }
      
      multi.fun(d2)
      #      mean     median        var         sd 
      # 237.50000  250.00000 4905.06329   70.03616 
      

      【讨论】:

      • 如果频率很大的解决方案是什么,例如不能扩展内存中的数据?
      【解决方案3】:

      根据您输入文件的格式,您可以使用read.csv("scores.txt")。您可以使用read.csv("scores.txt", sep="\t") 更改分隔符。如果您的数据没有标题,您可以使用选项header=F

      我将使用,,因为在这里更容易阅读。

      输入文件

      Score,Frequency
      100,10
      200,30
      300,40
      

      R 源代码

      x <- read.csv("scores.txt")
      mean(x$Score)
      median(x$Score)
      var(x$Score)
      mean(x$Score)
      sd(x$Score)
      

      R 输出

      > mean(x$Score)
      [1] 200
      > median(x$Score)
      [1] 200
      > var(x$Score)
      [1] 10000
      > mean(x$Score)
      [1] 200
      > sd(x$Score)
      [1] 100
      

      如果你想包含频率。

      R 源代码

      x <- read.csv("scores.txt")
      mean(rep(x$Score, x$Frequency))
      median(rep(x$Score, x$Frequency))
      var(rep(x$Score, x$Frequency))
      mean(rep(x$Score, x$Frequency))
      sd(rep(x$Score, x$Frequency))
      

      R 输出

      > mean(rep(x$Score, x$Frequency))
      [1] 237.5
      > x <- read.csv("scores.txt")
      > mean(rep(x$Score, x$Frequency))
      [1] 237.5
      > median(rep(x$Score, x$Frequency))
      [1] 250
      > var(rep(x$Score, x$Frequency))
      [1] 4905.063
      > mean(rep(x$Score, x$Frequency))
      [1] 237.5
      > sd(rep(x$Score, x$Frequency))
      [1] 70.03616
      

      【讨论】:

      • rep 函数是我过去一小时一直在寻找的!谢谢。
      【解决方案4】:
      lines <- readLines("scores.txt")[-1]
      mat <- matrix(as.numeric(unlist(
          strsplit(gsub(".*(\\d+).*(\\d+).*", "\\1,\\2", lines), ","))),
        ncol = 2, byrow = TRUE)
      print(summary(mat[, 1]))
      print(summary(mat[, 2]))
      

      【讨论】:

        猜你喜欢
        • 2016-10-04
        • 1970-01-01
        • 2018-08-13
        • 1970-01-01
        • 2013-11-05
        • 2021-10-15
        • 1970-01-01
        • 2015-05-17
        • 1970-01-01
        相关资源
        最近更新 更多