R語言快餐教程(1) - 我們開始做統(tǒng)計吧
R語言簡介
R語言是基于S語言的一種開源實現(xiàn)膳沽。S語言是貝爾實驗室最早開發(fā)的一種用于統(tǒng)計的工具界轩,后來成為商業(yè)的S-PLUS軟件炮温,是一種與SAS和SPSS齊名的統(tǒng)計軟件。
R語言的官方網(wǎng)址是:[https://www.r-project.org/]
R語言的一個重要的優(yōu)勢就是R的生態(tài)柬赐,有大量的高質(zhì)量的第三方的統(tǒng)計和算法相關(guān)的包绰姻。
在R中活下去
獲取幫助
首先我們學(xué)習(xí)如何在R中獲取函數(shù)幫助和函數(shù)的例子枉侧。
help(函數(shù)名)
例:比如我們想知道標(biāo)準差函數(shù)sd的用法:
help(sd)
輸出就是標(biāo)準差函數(shù)的用法信息:
sd package:stats R Documentation
Standard Deviation
Description:
This function computes the standard deviation of the values in
‘x’. If ‘na.rm’ is ‘TRUE’ then missing values are removed
before computation proceeds.
Usage:
sd(x, na.rm = FALSE)
Arguments:
x: a numeric vector or an R object which is coercible to one by
‘a(chǎn)s.double(x)’.
na.rm: logical. Should missing values be removed?
Details:
Like ‘var’ this uses denominator n - 1.
The standard deviation of a zero-length vector (after removal of
‘NA’s if ‘na.rm = TRUE’) is not defined and gives an error.
The standard deviation of a length-one vector is ‘NA’.
See Also:
‘var’ for its square, and ‘mad’, the most robust alternative.
Examples:
sd(1:2) ^ 2
詳細例子
R對于很多函數(shù)都有非常詳盡的例子,對于圖形類的函數(shù)狂芋,還圖文并茂榨馁。
格式:example(函數(shù)名)
例:
> example(sd)
sd> sd(1:2) ^ 2
[1] 0.5
大家可以試試圖形的函數(shù),如:
example(hist)
執(zhí)行一個R文件
寫好的R文件帜矾,可以通過source("filename.R")的形式裝載進來翼虫。
保存和讀取數(shù)據(jù)
可以通過save函數(shù)將R的內(nèi)存數(shù)據(jù)保存到一個Rdata文件中。下次再通過load()函數(shù)讀取出來屡萤。
例:
save(gun_data,file="gun_data.Rdata")
安裝CRAN上的擴展包
我們在學(xué)習(xí)R的語法之前珍剑,就先學(xué)習(xí)如何下載擴展包,因為將來有很多任務(wù)死陆,我們就是要靠擴展包來完成的次慢。
命令:install.packages("包名")
例:
install.packages("fBasics")
下載了之后,還需要在使用之前通過library()函數(shù)將庫裝載進來:
比如我要使用timeDate庫:
library(timeDate)
讀取csv數(shù)據(jù)
既然要處理數(shù)據(jù),肯定要先從數(shù)據(jù)源讀取數(shù)據(jù)迫像。我們選取最簡單的方式劈愚,從csv文件中讀取。
假設(shè)我們有這樣一個csv文件:
times,total, copy
1,122.18138504,48.200
2,114.014596224,38.447
3,113.279325008,37.968
4,117.902994871,37.850
5,112.485991001,37.020
6,113.543860197,37.302
7,112.150246143,36.432
8,110.57020092,36.794
9,112.11462307,37.218
10,117.439277172,37.399
我們使用read.csv函數(shù)將其讀到gun
gun_data <- read.csv("gun-1128-2.csv",header=T,col.names=c("times","total","copy"))
c()函數(shù)用于生成向量闻妓。R語言中沒有標(biāo)量菌羽,看著來像標(biāo)量的,其實也是長度為1的向量由缆。
讀到gun_data中后注祖,就可以通過行和列來訪問數(shù)據(jù)了。
可以用下標(biāo)訪問:
gun_data[,2]
[1] 122.1814 114.0146 113.2793 117.9030 112.4860 113.5439 112.1502 110.5702
[9] 112.1146 117.4393 112.5256 112.2260 109.8838 118.0142 111.8233 112.9887
[17] 113.0641 112.2024 112.2671 111.3121 111.4523 112.3540 111.6928 112.7954
[25] 110.7357 110.3518 115.5703 111.7312 112.3798 111.7919 111.9345 113.4122
[33] 112.2419 111.8948 110.8999 111.8572 112.7399 112.7252 112.6550 111.7474
[41] 109.7888 111.1741 110.6528 112.0334 113.1800 112.9429 111.2413 112.3243
[49] 113.6774 110.8865 112.2398 112.5997 110.9474 111.6045 113.1162 112.7430
[57] 111.4020 113.6355 114.9378 112.1180 111.0081 111.6405 112.9142 110.6213
[65] 112.3076 113.0985 113.9538 112.2582 111.8185 114.2400 114.4118 112.5618
[73] 113.2215 112.0616 114.1094 125.1672 125.7026 114.0470 113.8599 119.5466
[81] 113.7481 118.8992 116.7088 114.9942 115.2779 115.9557 112.9537 113.7493
[89] 114.1442 113.9163 112.8527 119.0420 113.5002 112.9147 113.5229 113.1191
[97] 112.1945 113.7664 111.7049 113.3210
可以用雙括號加下標(biāo)訪問:
> gun_data[[2]]
[1] 122.1814 114.0146 113.2793 117.9030 112.4860 113.5439 112.1502 110.5702
[9] 112.1146 117.4393 112.5256 112.2260 109.8838 118.0142 111.8233 112.9887
[17] 113.0641 112.2024 112.2671 111.3121 111.4523 112.3540 111.6928 112.7954
[25] 110.7357 110.3518 115.5703 111.7312 112.3798 111.7919 111.9345 113.4122
[33] 112.2419 111.8948 110.8999 111.8572 112.7399 112.7252 112.6550 111.7474
[41] 109.7888 111.1741 110.6528 112.0334 113.1800 112.9429 111.2413 112.3243
[49] 113.6774 110.8865 112.2398 112.5997 110.9474 111.6045 113.1162 112.7430
[57] 111.4020 113.6355 114.9378 112.1180 111.0081 111.6405 112.9142 110.6213
[65] 112.3076 113.0985 113.9538 112.2582 111.8185 114.2400 114.4118 112.5618
[73] 113.2215 112.0616 114.1094 125.1672 125.7026 114.0470 113.8599 119.5466
[81] 113.7481 118.8992 116.7088 114.9942 115.2779 115.9557 112.9537 113.7493
[89] 114.1442 113.9163 112.8527 119.0420 113.5002 112.9147 113.5229 113.1191
[97] 112.1945 113.7664 111.7049 113.3210
可以用列名訪問
> gun_data[["total"]]
[1] 122.1814 114.0146 113.2793 117.9030 112.4860 113.5439 112.1502 110.5702
[9] 112.1146 117.4393 112.5256 112.2260 109.8838 118.0142 111.8233 112.9887
[17] 113.0641 112.2024 112.2671 111.3121 111.4523 112.3540 111.6928 112.7954
[25] 110.7357 110.3518 115.5703 111.7312 112.3798 111.7919 111.9345 113.4122
[33] 112.2419 111.8948 110.8999 111.8572 112.7399 112.7252 112.6550 111.7474
[41] 109.7888 111.1741 110.6528 112.0334 113.1800 112.9429 111.2413 112.3243
[49] 113.6774 110.8865 112.2398 112.5997 110.9474 111.6045 113.1162 112.7430
[57] 111.4020 113.6355 114.9378 112.1180 111.0081 111.6405 112.9142 110.6213
[65] 112.3076 113.0985 113.9538 112.2582 111.8185 114.2400 114.4118 112.5618
[73] 113.2215 112.0616 114.1094 125.1672 125.7026 114.0470 113.8599 119.5466
[81] 113.7481 118.8992 116.7088 114.9942 115.2779 115.9557 112.9537 113.7493
[89] 114.1442 113.9163 112.8527 119.0420 113.5002 112.9147 113.5229 113.1191
[97] 112.1945 113.7664 111.7049 113.3210
查詢內(nèi)存中的對象
ls()函數(shù)
例:
> ls()
[1] "C." "C1" "C2" "C3"
[5] "Cl" "clK" "clS" "EV"
[9] "gun_1128" "gun_data" "gun_data3" "gun_data4"
[13] "i" "inst_qq" "inst_qq_5_1" "inst_qq_5_4_1"
[17] "op" "out" "r" "R."
[21] "Rc" "Rp" "swM" "total_data"
[25] "x"
我們開始做統(tǒng)計吧
下面我們開始學(xué)一些短平快的做統(tǒng)計的方法吧均唉。
均值
最簡單的就是平均值了是晨。所有的數(shù)求和,再除以個數(shù)就是了舔箭。
R語言中用mean()函數(shù)來求均值罩缴。
例:
> mean(gun_data3[[2]])
[1] 103.1747
> mean(gun_data4[[2]])
[1] 113.3303
中位數(shù)
均值的問題在于,如果異常值比較大层扶,會把均值拉高或拉低箫章。而中位數(shù)是排序后處于中間的數(shù),不受異常值的影響镜会。
R語言中用median函數(shù)求中位數(shù):
> median(gun_data3[[2]])
[1] 101.651
> median(gun_data4[[2]])
[1] 112.7326
五數(shù)
所謂五數(shù)檬寂,就是最小值,25%分位值戳表,中位數(shù)桶至,75%分位值,最大值匾旭。
這五個數(shù)可以通過fivenum()函數(shù)一次性求出來镣屹。
> fivenum(gun_data3[["total"]])
[1] 98.92649 100.48752 101.65097 105.94518 116.74337
> fivenum(gun_data4[["total"]])
[1] 109.7888 111.8402 112.7326 113.7578 125.7026
連同均值,summary函數(shù)能一次將6個數(shù)都求出來:
> summary(gun_data3[,"total"])
Min. 1st Qu. Median Mean 3rd Qu. Max.
98.93 100.50 101.70 103.20 105.80 116.70
> summary(gun_data4[,"total"])
Min. 1st Qu. Median Mean 3rd Qu. Max.
109.8 111.8 112.7 113.3 113.8 125.7
方差
方差是各樣本值與均值的差值的平方的和季率,反映了數(shù)據(jù)的離散程度野瘦。
> var(gun_data3[,"total"])
[1] 12.70904
> var(gun_data4[,"total"])
[1] 7.397949
標(biāo)準差
方差的平方根是標(biāo)準差。R語言用sd()函數(shù)求標(biāo)準差
> sd(gun_data3[,"total"])
[1] 3.564974
> sd(gun_data4[,"total"])
[1] 2.719917
標(biāo)準差是方差的平方根飒泻,我們用R語言驗證一下:
> sqrt(var(gun_data3[,"total"]))
[1] 3.564974
果然跟sd()的值是一樣的
離差
離差是R中提供的一個特殊功能鞭光,它是相對于中位數(shù)的偏差的絕對值和:
mad(x) = 1/qnorm(3/4) * median(abs(x-median(x)))
離差用mad()函數(shù)計算。
偏度
如果結(jié)果不符合正態(tài)分布泞遗,我們希望知道是向左偏還是向右偏惰许,這個值用偏度skewness來表示。R中用skewness()函數(shù)來計算史辙。如果值>0為右偏汹买,反之為左偏佩伤。
求偏度的函數(shù),首先要通過install.packages來下載fBasics庫晦毙,然后引入timeDate庫:
> library(timeDate)
> skewness(gun_data3[,2])
[1] 1.109821
attr(,"method")
[1] "moment"
> skewness(gun_data4[,2])
[1] 2.40715
attr(,"method")
[1] "moment"
從中可以看以生巡,這兩組數(shù)據(jù)都向右偏。gun_data4偏得更厲害见妒。
峰度
峰度是判斷這個分布是比正態(tài)分布的圖更尖還是更平孤荣。
R中用kurtosis()函數(shù)來計算
> kurtosis(gun_data3[,2])
[1] 0.7986081
attr(,"method")
[1] "excess"
> kurtosis(gun_data4[,2])
[1] 7.060265
attr(,"method")
[1] "excess"
上面的兩個分布都>0,說明比正態(tài)分布都要尖须揣。