R计算具有频率分布的文件的均值,中值,方差

时间:2014-03-25 19:28:36

标签: r statistics

我是R工具的新手,我的问题可能有点太明显了。

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

Score     Frequency

 100         10

 200         30

 300         40

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

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

x< - scan(file =" scores.txt",what = integer())

中值(x)的

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

4 个答案:

答案 0 :(得分:6)

使用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 

答案 1 :(得分: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

答案 2 :(得分:2)

只需按照您手动完成的方式进行操作即可:

让我们成为得分的载体,而成为频率的载体。

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)

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

答案 3 :(得分:0)

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