2014-03-25 119 views
4

我對R工具很新,我的問題可能有點太明顯。R計算平均值,中位數,來自頻率分佈文件的方差

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

Score  Frequency 

100   10 

200   30 

300   40 

我如何讀取這個文件,並計算平均值,中位數,方差和標準差?

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

X < - 掃描(文件= 「scores.txt」,什麼=整數())

中位數(x)

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

回答

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