最近在復習python的科學計算蛮穿,突然心血來潮余境,想看看R的數(shù)據(jù)處理和python的區(qū)別在哪驻呐,所以就有了這篇文章。
R語言簡介
四十多年前葛超, R 語言的始祖誕生了 暴氏, John Chambers 在貝爾實驗室中開發(fā)出S語言 ,用于快速地進行數(shù)據(jù)探索绣张, 統(tǒng)計分析和可視化 答渔。十幾年后 , 新西蘭奧克蘭大學的 Robert Gentleman 和 Ross Ihaka 在 S 語言的基礎上發(fā)明了 R 語言 。
R 語言流淌著統(tǒng)計學的血液 侥涵, 它內置了海量的統(tǒng)計函數(shù) 沼撕,使用者可以利用其對數(shù)據(jù)進行快速交互分析 。 同時作為一門圖靈完備的解釋性語言 芜飘, R 的使用者比 SAS , SPSS 等統(tǒng)計軟件的使用者擁有了更大程度的自由务豺。
進入 21 世紀后 ,由于個人計算機的普及和統(tǒng)計學科的發(fā)展 嗦明, R 社群得以進一步發(fā)展 笼沥, 一些富有想象力的優(yōu)秀工具涌現(xiàn)出來 。 如果把 R 語言比作一輛車的話 娶牌, Rstudio 的出現(xiàn)使得我們有了信息更加豐富的儀表盤 奔浅, dplyr , data.table 等等數(shù)據(jù)處理的包加強了引擎 , ggplot , shiny 等等可視化的工具使得車的外型更好看诗良。
與大多用于工程實踐的編程語言相比 汹桦, R 語言更像是一個靈巧的研究工具 ,在處理大量數(shù)據(jù) 鉴裹, 性能方面比較薄弱舞骆。但是與其他工具交互就能漂亮地解決問題 钥弯, 例如與 Spark 配合 (sparkR) 解決數(shù)據(jù)量較大的情況 , 與 C++(Rcpp) 配合可以解決性能不足的問題督禽。
早在五十多年前 脆霎, John Tukey 就在論文 "The Future of Data Analysis"[1] 中發(fā)表了這樣的看法:統(tǒng)計學不應該只是關于統(tǒng)計推斷的數(shù)學理論,而應該和現(xiàn)實世界聯(lián)系起來赂蠢,成為一種“科學”绪穆。為了實現(xiàn)這樣的目標,需要有收集和整理數(shù)據(jù)虱岂、分析和解釋數(shù)據(jù)的技術玖院,并且把實踐當成檢驗理論的標準。
R語言及其生態(tài)作為連接現(xiàn)實世界中的數(shù)據(jù)和數(shù)學模型的橋梁第岖,正在社群的努力下一步一步地把這些想法具體化难菌。
讓我們進入 R 語言的世界!
R語言的安裝
ubuntu下安裝
1蔑滓、直接到官網(wǎng)上下載安裝包(tar.gz)郊酒,然后依次安裝即可。
2键袱、在網(wǎng)速可以的情況下燎窘,利用在apt-get安裝是一種更為方便的方式:
sudo apt-get update
sudo apt-get install r-base
sudo apt-get install r-base-dev
MAC下安裝
mac安裝更簡單
下載R安裝包,完成后點安裝蹄咖。
R語言基本數(shù)據(jù)結構
下面用 R 的解釋器來熟悉一下 R 語言的基本數(shù)據(jù)結構褐健。
首先讓我們先進入 R 環(huán)境下
我是在mac操作環(huán)境下的,ubuntu的是一樣的澜汤。
youdi@liangchangyoudeMacBook-Pro ~ R
R version 3.4.1 (2017-06-30) -- "Single Candle"
Copyright (C) 2017 The R Foundation for Statistical Computing
Platform: x86_64-apple-darwin15.6.0 (64-bit)
R是自由軟件蚜迅,不帶任何擔保。
在某些條件下你可以將其自由散布俊抵。
用'license()'或'licence()'來看散布的詳細條件谁不。
R是個合作計劃,有許多人為之做出了貢獻.
用'contributors()'來看合作者的詳細情況
用'citation()'會告訴你如何在出版物中正確地引用R或R程序包徽诲。
用'demo()'來看一些示范程序刹帕,用'help()'來閱讀在線幫助文件,或
用'help.start()'通過HTML瀏覽器來看幫助文件谎替。
用'q()'退出R.
>
>
向量
向量是 R 語言中最基本的數(shù)據(jù)類型轩拨,在 R 中沒有單獨的標量(例如 1 本質上是 c(1)) 瓮具。
賦值
R 中可以用 = 或者 <- 來進行賦值 嚼锄, <-的快捷鍵是 alt + - 既鞠。
> a <- c(4,5,6)
> a
[1] 4 5 6
篩選
我們可以用下標來篩選,例如
> a[1:2]
[1] 4 5
> a[3]
[1] 6
注意 R 語言的下標是從 1 開始的喷舀。
當然我們也可以用邏輯進行篩選砍濒,例如
> a[a>4]
[1] 5 6
> a[a>5]
[1] 6
為了了解這個式子的原理,我們先看看 a>4 是什么
> a>4
[1] FALSE TRUE TRUE
我們可以看到這是一個布爾值構成的向量硫麻,我們在用這個布爾值
做下標時只會選出答案為 TRUE 的值爸邢。
另外,負數(shù)下標表示不選這個這些下標拿愧,例如:
> a[-1]
[1] 5 6
> a[-2]
[1] 4 6
> a[-3]
[1] 4 5
> a[-4]
[1] 4 5 6
合并向量
c() 可以合并向量杠河,例如
> c(a[1] , 3 , a[2:3] , 1)
[1] 4 3 5 6 1
循環(huán)補齊
向量有個比較有趣的性質,當兩個向量進行操作時浇辜,如果長度不等券敌,
長度比較短的一個會復制自己直到自己和長的一樣長。
> b
[1] 1 2 3 4 5 6 7 8
> a
[1] 4 5 6
> a + b
[1] 5 7 9 8 10 12 11 13
Warning message:
In a + b : 長的對象長度不是短的對象長度的整倍數(shù)
> b <- c(1,2,3,4,5,6,7,8,9)
> a + b
[1] 5 7 9 8 10 12 11 13 15
> length(b)
[1] 9
> which.max(b)
[1] 9
> which.min(b)
[1] 1
不懂就使用help()
查看命令手冊
矩陣
矩陣柳洋,從本質上來說就是多維的向量待诅,我們來看一看
我們如何新建一個矩陣。
> a <- matrix(c(1,2,3,4,5,6,7,8,9), nrow=3)
> a
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
matrix有很多參數(shù)
help(matrix)
Usage:
matrix(data = NA, nrow = 1, ncol = 1, byrow = FALSE,
dimnames = NULL)
as.matrix(x, ...)
## S3 method for class 'data.frame'
as.matrix(x, rownames.force = NA, ...)
is.matrix(x)
篩選矩陣
與向量相似熊镣,我們可以用下標來篩選矩陣卑雁,
例如:
> a[1, 2:3]
[1] 4 7
可以看到結果退化成了一個向量
線性代數(shù)
當我們對兩個矩陣相乘,我們得到的結果是
對應元素兩兩相乘的結果绪囱,例如
> a
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
> a * a
[,1] [,2] [,3]
[1,] 1 16 49
[2,] 4 25 64
[3,] 9 36 81
而這不是我們想要的矩陣乘法测蹲,在 R 中我們在乘法旁邊加兩個
百分號來做矩陣乘法:
> a%*%a
[,1] [,2] [,3]
[1,] 30 66 102
[2,] 36 81 126
[3,] 42 96 150
此外,我們可以用 t() 來求矩陣的轉置 鬼吵, 用 solve() 來求矩陣的逆扣甲。
數(shù)據(jù)框
數(shù)據(jù)框類似矩陣,與矩陣不同的是而柑,數(shù)據(jù)框可以有不同的數(shù)據(jù)類型文捶。
一般做數(shù)據(jù)分析,我們把一個類似 excel 的表格讀入 R 媒咳,默認的格式
就是數(shù)據(jù)框 粹排, 可見數(shù)據(jù)框是一個非常重要的數(shù)據(jù)結構。
一般來說我們需要分析的數(shù)據(jù)涩澡,每一行代表一個樣本顽耳,每一列代表一個
變量。
下面我們用 R 內置的數(shù)據(jù)集 iris 來看一看數(shù)據(jù)框的使用妙同。
> data("iris")
> head(iris)
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 5.1 3.5 1.4 0.2 setosa
2 4.9 3.0 1.4 0.2 setosa
3 4.7 3.2 1.3 0.2 setosa
4 4.6 3.1 1.5 0.2 setosa
5 5.0 3.6 1.4 0.2 setosa
6 5.4 3.9 1.7 0.4 setosa
> tail(iris)
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
145 6.7 3.3 5.7 2.5 virginica
146 6.7 3.0 5.2 2.3 virginica
147 6.3 2.5 5.0 1.9 virginica
148 6.5 3.0 5.2 2.0 virginica
149 6.2 3.4 5.4 2.3 virginica
150 5.9 3.0 5.1 1.8 virginica
> tail(iris, 20)
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
131 7.4 2.8 6.1 1.9 virginica
132 7.9 3.8 6.4 2.0 virginica
133 6.4 2.8 5.6 2.2 virginica
134 6.3 2.8 5.1 1.5 virginica
135 6.1 2.6 5.6 1.4 virginica
136 7.7 3.0 6.1 2.3 virginica
137 6.3 3.4 5.6 2.4 virginica
138 6.4 3.1 5.5 1.8 virginica
139 6.0 3.0 4.8 1.8 virginica
140 6.9 3.1 5.4 2.1 virginica
141 6.7 3.1 5.6 2.4 virginica
142 6.9 3.1 5.1 2.3 virginica
143 5.8 2.7 5.1 1.9 virginica
144 6.8 3.2 5.9 2.3 virginica
145 6.7 3.3 5.7 2.5 virginica
146 6.7 3.0 5.2 2.3 virginica
147 6.3 2.5 5.0 1.9 virginica
148 6.5 3.0 5.2 2.0 virginica
149 6.2 3.4 5.4 2.3 virginica
150 5.9 3.0 5.1 1.8 virginica
我們用 data 函數(shù)調入了 iris 這個數(shù)據(jù)集 射富, 然后用 head 函數(shù)來看一看這個數(shù)據(jù)
的前幾行 , tail 函數(shù)來看一看這個數(shù)據(jù)
的后幾行 可以看到有 sepal 的長度粥帚,寬度胰耗,petal 的長度和寬度,還有一個變量
Species 來描述樣本的類別芒涡。
我們可以用 summary 函數(shù)來對數(shù)據(jù)集做大致的了解:
> sum
sum summary.Date summary.POSIXlt summary.connection summary.default summary.glm summary.manova summary.proc_time summary.srcref summary.table
summary summary.POSIXct summary.aov summary.data.frame summary.factor summary.lm summary.matrix summary.srcfile summary.stepfun summaryRprof
> summary(iris)
Sepal.Length Sepal.Width Petal.Length Petal.Width
Min. :4.300 Min. :2.000 Min. :1.000 Min. :0.100
1st Qu.:5.100 1st Qu.:2.800 1st Qu.:1.600 1st Qu.:0.300
Median :5.800 Median :3.000 Median :4.350 Median :1.300
Mean :5.843 Mean :3.057 Mean :3.758 Mean :1.199
3rd Qu.:6.400 3rd Qu.:3.300 3rd Qu.:5.100 3rd Qu.:1.800
Max. :7.900 Max. :4.400 Max. :6.900 Max. :2.500
Species
setosa :50
versicolor:50
virginica :50
可以直觀地看到每個變量的信息柴灯,對于幾個數(shù)值變量卖漫,我們可以看到最小值,中位數(shù)等等統(tǒng)計信息赠群。而對于 Species 這個分類變量羊始,我們看到的是計數(shù)信息。
篩選數(shù)據(jù)框與矩陣相似,都可以通過數(shù)字下標來獲取子集查描,不同地是因為數(shù)據(jù)框有不同的列名,我們也可以通過列名來獲取某一特定列,例如
> iris$Species
[1] setosa setosa setosa setosa setosa setosa
[7] setosa setosa setosa setosa setosa setosa
[13] setosa setosa setosa setosa setosa setosa
[19] setosa setosa setosa setosa setosa setosa
[25] setosa setosa setosa setosa setosa setosa
[31] setosa setosa setosa setosa setosa setosa
[37] setosa setosa setosa setosa setosa setosa
[43] setosa setosa setosa setosa setosa setosa
[49] setosa setosa versicolor versicolor versicolor versicolor
[55] versicolor versicolor versicolor versicolor versicolor versicolor
[61] versicolor versicolor versicolor versicolor versicolor versicolor
[67] versicolor versicolor versicolor versicolor versicolor versicolor
[73] versicolor versicolor versicolor versicolor versicolor versicolor
[79] versicolor versicolor versicolor versicolor versicolor versicolor
[85] versicolor versicolor versicolor versicolor versicolor versicolor
[91] versicolor versicolor versicolor versicolor versicolor versicolor
[97] versicolor versicolor versicolor versicolor virginica virginica
[103] virginica virginica virginica virginica virginica virginica
[109] virginica virginica virginica virginica virginica virginica
[115] virginica virginica virginica virginica virginica virginica
[121] virginica virginica virginica virginica virginica virginica
[127] virginica virginica virginica virginica virginica virginica
[133] virginica virginica virginica virginica virginica virginica
[139] virginica virginica virginica virginica virginica virginica
[145] virginica virginica virginica virginica virginica virginica
Levels: setosa versicolor virginica
我們可以用 names() 函數(shù)來獲取數(shù)據(jù)框的列名:
> names(iris)
[1] "Sepal.Length" "Sepal.Width" "Petal.Length" "Petal.Width" "Species"
并可以通過為其賦值改變列的名字突委。
列表
列表是一種遞歸式的向量,我們可以用列表來存儲不同類型的數(shù)據(jù),比如
> l <- list(name="youdi" , height=176 , weight = 67, man = TRUE)
> l
$name
[1] "youdi"
$height
[1] 176
$weight
[1] 67
$man
[1] TRUE
列表有多種索引方式冬三,可以用如下方式獲取匀油。
> l$name
[1] "youdi"
> l$height
[1] 176
> l$man
[1] TRUE
> l[1]
$name
[1] "youdi"
> l[[2]]
[1] 176
> l[['man']]
[1] TRUE
上面的內容涵蓋了 R 語言最基本的數(shù)據(jù)結構.
R 語言學習優(yōu)秀資源
網(wǎng)絡資源
DataCamp : 一個提供云端R語言解釋器的網(wǎng)站 ,提供了多門與數(shù)據(jù)科學有關的課程长豁,可以借助此網(wǎng)站快速上手钧唐。
統(tǒng)計之都 : 國內質量最高的統(tǒng)計網(wǎng)站,有一些關于統(tǒng)計和R語言的優(yōu)秀博客以及與R有關的會議通知匠襟。
肖凱博客(需翻墻): 很有質感的博客钝侠,有大量 R 語言應用的案例。
數(shù)據(jù)科學相關書籍
R for data science : 由 Hadley Wickham 合作編寫的 2017 年出版的書籍 酸舍,主要介紹的 tidyverse 生態(tài) , tidyverse 中包括了 dplyr(用于數(shù)據(jù)處理) , ggplot(用于畫圖)等包帅韧,大幅增強了 R 語言的表現(xiàn)力 , 有免費的在線版本。
R 語言實戰(zhàn) : 一本從統(tǒng)計角度介紹 R 語言的書籍 啃勉,較為簡單 忽舟, 適合快速翻閱。
An Introduction to Statistical Learning : 斯坦福統(tǒng)計系幾位教授出版的統(tǒng)計學習書籍淮阐,對統(tǒng)計學習進行了清晰細致的講解 叮阅, 書有開源版本 ,并且在Stanford Lagunita上有配套課程
Machine Learning For Hackers : 使用機器學習解決問題的一本書 泣特, 有很多有趣的案例 浩姥。