簡體   English   中英

R 計算均值、中值、方差與頻率分布的文件

[英]R computing mean, median, variance from file with frequency distribution

我對 R 工具很陌生,我的問題可能有點太明顯了。

我有一個包含以下數據的文件:

Score     Frequency

 100         10

 200         30

 300         40

如何讀取此文件並計算均值、中值、方差和標准差?

如果上表只是沒有任何頻率信息的原始分數,那么我可以這樣做:

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

中位數(x)

等等,但是當給定頻率表時,我無法理解如何進行這些計算。

使用read.table讀取數據(read ?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 

根據您輸入文件的格式,您可以使用read.csv("scores.txt") 您可以使用read.csv("scores.txt", sep="\\t")更改分隔符。 如果您的數據沒有標題,則可以使用選項header=F

我將使用 a ,因為這里更容易閱讀。

輸入文件

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

只需按照您手動完成的方式進行操作:

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

這避免了使用 rep,當數字很大時,這很麻煩。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM