、R 語言是什么?
R 語言是一個專門為統計而開發出來的一個計算機編程語言,它是一種解釋性型的面向數學理論研究工作者的語言。類似于MATLAB,他在語言層面提供了更加豐富的數據結構,且能夠十分方便地輸出文字和圖形信息,所以廣泛應用于數據分析,尤其是統計學領域。
我們使用R 語言一般都會搭配 Rstudio 使用(它是一款 R 語言的操作界面,具有代碼調試、可視化等功能)
Rstudio操作界面介紹
2、R 語言能做什么?
現在的 R 語言可以做 統計分析、數據可視化、機器學習(包括深度學習)。
—— R 語言的系統學習可以參考[R 語言教程](https://www.math.pku.edu.cn/teachers/lidf/docs/Rbook/html/_Rbook/intro.html#intro-hist-char)
R語言出的圖
——(關于 R 語言學術表格的繪制方法可以參考[《R 語言數據可視化之美》](https://read.douban.com/reader/ebook/130453795/))
同時R 語言還能實現地理可視化(GIS),通過“arcgisbinding”包可以實現在 R 語言中導入、轉化和導出 ArcGis 數據集。還有專門為 R 和 ArcGis 開發的軟件[R-ArcGis](https://r.esri.com/)
```
如果你想做 Bayesian,只要在 R 里面調用 OpenBUGS,WinBUGS,JAGS 等這些已經成熟的 package 來進行貝葉斯分析。
```
怎么樣R 語言是不是非常有用,那我們趕快學起來吧!
下篇文章來教大家怎么利用R語言進行簡單 BP神經網絡 建模
R 語言幾乎不需要編程,大部分的操作只需要調用 package 來執行就可以了.我們只需要了解R的基礎語法
家好,這是從知乎《一個大學生的日常筆記》中遷移過來的R語言教程的第一篇。
這一份筆記follow了兩本非常優秀的R語言教材,分別是Robert I.Kabacoff的《R語言實戰》和Peter Dalgaard的《R語言統計入門》,兩本教材的思路有所不同,我會根據我自己的思路盡量降低學習門檻,綜合來寫教程。(畢竟提高了門檻,我就不知道自己在寫什么了……那就真的沒卵用了……)
閱讀教程的時候我有自己的思路,看過我的LaTeX入門筆記的同學們會明白,如果我想到了一些可能會讓入門新手迷糊的地方,我會以注意:這樣的形式去標記出來,而且有的時候,可能這些小插曲更加重要,請不要忽略它們。
例子大部分都是摘抄的,但是我會做一些解釋和細節上的調整,同時考慮到代碼規范的問題,我很多例子不會提供符號可選的余地,比如"和',用于標記字符都可以,但是代碼規范推薦使用"
目前我已經是準大二學生,統計的先修課只有一門學校上的《概率論與數理統計》,事實上,這門課學完之后,R的大部分內容就已經可以上手操作了。因此我們不會在這門課程已有的理論部分下功夫去解釋。但是,礙于我自己本科生的視野,我們不會把太復雜,或者根本不可能涉及到的的內容搬到這里,因此這對于真正的statistician,或者是統計學專業的大牛來說,可能最多只是一份入門筆記而已。
不過也還是有些亮點的,我可能會在教程里夾雜點別的語言的新奇玩意做些互相的對比2333
引言到此為止,下面我們開始正題。
細心的同學可能已經看到了封面的那個圖,那個就是我們推薦下載的R語言編輯器——Rstudio,但是這僅僅是個編輯器,必須下載安裝真正的R語言編譯器才能夠運行。至于如何下載——百度搜索R和Rstudio關鍵字就好。那兩個玩意的圖標大概長這樣
我們主要使用的編輯器是Rstudio,但是為了教程的完整性(integrity),這里展示一張R語言的打開界面
輸入一行命令試試?
plot(rnorm(1000))
(居然沒提供R語言的選項……)
系統會為你畫一張圖
這是一張含有1000個按正態分布排列的隨機數的圖。
R的環境到此結束,下面我們回到Rstudio來看看
我們可以看到Rstduio有四個區域。分別的功能是
可以看出,綜合的功能是比R要強大很多的,而且根據我們網站組的大佬的反應,這玩意其實是一個html……也就是說你會JS你就可以惡搞它的界面啦
對了,在你關掉R/Rstudio的時候,系統會問你是否要保存空間映像,那個其實就是保存歷史記錄,方便以后繼續使用而設置的。
R語言是一個統計語言。統計數據離不開一個良好的用于儲存的結構和標識。我們會先從它的基本操作講起,在其中夾雜著數據類型,數據框等大量的結構和細節。
首先說說幫助文檔
R語言和C++/python不一樣,R語言非常瑣碎,因此seek for help是必要的,但是R的official document很難懂,因此不推薦拿那個去當作你學習的教程。我們推薦的是以下三種尋求幫助的命令
help("function") or ?function
help.search("function") or ??function
example("function")
第一個是查函數的幫助文檔,第二個是以某一個function為關鍵字搜索幫助文檔。第三個會給出某一個函數的使用示例。在對函數不熟悉的時候一定要學會使用它。
不管是什么樣的計算機語言,賦值都是最基礎的工作。但是賦值符號不是C++里的=,而是<-,比如
r <- 2
注意:用=賦值是不會被編譯器報錯的,但是由于這個語法不標準,所以有的時候會出問題。
隨著賦值而來的就是數值運算,但是我們不強調那種單變元的數值運算,R有個很強大的功能是向量化操作(當然matlab也有)。(向量理解為一系列變量的按序組合(比如數值向量可以理解為數列)就好)比如說給予五個人身高體重的例子,我們計算一個BMI。
A <- c(1.84,1.74,1.65,1.58,1.81)
B <- c(86.2,65,51.5,45,56)
BMI <- (B/(A^2))
BMI
最后顯示的結果是
確實是一個向量。
注意:R語言構造向量的方法是c(...)
注意:如果不輸入某一個變量的名稱,R默認是不顯示結果的,因此我最后一行又加了一個BMI變量名顯示它。
注意:我們推薦寫多行R代碼的時候使用腳本,之后在Rstudio中,腳本區域的右上角有三個按鈕,第一個run是逐行運行代碼,第三個source是運行全部代碼(但是要在下拉框選擇source with echo,否則依然顯示不了結果),大家注意回去找找看。
注意:如果你真的點擊了source去運行代碼的話,可以在command區域看到這樣的命令
source('C:/Users/Asus/Desktop/A.R')
拿出來說的原因是想強調:如果你要輸入一個文件路徑,一定要輸入正斜杠/,因為反斜杠是轉義字符(escaped character),在""中間輸入字符,如果想讓它打印出",就可以輸入\"。
我們回到向量這個問題上來
常用的R的數據類型有三種:數字,字符,邏輯真假(當然還有個缺失值類型,我們在之后會說)。因此我們也可以創建字符和邏輯向量。
關于字符向量,我們列舉下面三個例子
c("A","B","C")
cat(c("A","B","C"))
cat(c("A","B","C"),'\n')
顯示的結果如下
哎?二和三有什么區別嗎?
如果你在R中運行的話,第二行的命令是默認不換行的,所以就會出現
的情況,不過在Rstudio里,這種情況得到了改善。
注意:cat是連接+輸出的函數,而c只負責連接,在例子中,cat可以消除字符串的""符號。你可以連接任何東西,包括向量。
注意:R的向量要求內部的所有元素數據類型相同。如果通過cat/c連接兩個不同數據類型的向量,系統會進行強制轉換。比如
A <- c("A","B","C")
B <- c(1,2,3)
c(A,B)
結果留給大家自己觀察。(這里原來出了一處錯誤,已經修正,謝謝
@快走姑娘
提醒)
和數值運算類比的就是邏輯運算,但是我不打算在這里先說這些。
伴隨著向量的就是索引,目的自然是為了取用這些元素。索引的方法是[],舉2個例子
A <- c("A","B","C")
A[2]
B <- c("A"=1,"B"=2,"C"=3)
B["B"]
顯示的結果如下
注意:向量內的元素是有序的,這里A[2]索引的就是第二個,不是程序員認為的第三個!
注意:第二個例子中,我們相當于人工設置了索引(在python里,有個專門的數據結構叫字典(dict))為"A","B","C",它們叫這些變量的名稱(name),一一對應1,2,3。和自然索引1,2,3不同的是,這里的人工索引在查看變量的時候會顯示。
注意:索引也可以索引一個向量,也就是索引多個元素(和matlab一樣),比如說,試著運行一下下面這個命令。
A <- c("A","B","C")
A[c(2,3)]
結果留給你們自己去發現。
注意:索引也可以是負索引!它不是python里“倒數第幾個”的含義,它的意思是“索引除標記以外的所有元素”。在數據清洗中非常常見,可以用一個例子去幫助理解
A <- c("A","B","C")
A[-c(2,3)]
自己去敲敲代碼看看結果吧
注意:你甚至可以使用索引進行賦值,即使它已經超出了這個向量的長度,比如說
A[7]="D"
那么,A這個時候第7個確實是字符D,但是原來的第4-6個呢?實際上它們是缺失值。也就是NA。至于缺失值是什么樣的數據類型,這會在之后提到。
注意:對于名稱,字符串中的""要求會放寬,也就是說,你還可以這么寫。
B <- c(A=1,B=2,C=3)
結果是一樣的
對于我這種懶人來說,這可真是個福音。
下面我們說說矩陣和數組。
矩陣可以理解為二維的向量。但是創建矩陣的參數就一下子多了很多,因此可能會稍有點難理解,我們用兩組例子結束這一切。
第一組:
S <- c(1,2,3,4,5,6,7,8,9)
rnames <- c(1,2,3)
cnames <- c("A","B","C")
C=matrix(S,nrow=3,ncol=3,byrow=TRUE,dimnames=list(rnames,cnames))
C=matrix(S,nrow=3,ncol=3,byrow=FALSE,dimnames=list(rnames,cnames))
C=matrix(S,nrow=2,ncol=4,byrow=TRUE,dimnames=list(rnames,cnames))
顯示的結果如下
我改變的參數在byrow這里,它提示我們應該按行填充還是按列填充。TRUE自然就是按行存儲的意思。
Oh,第三個報錯了,看一下報錯信息。
data length [9] is not a sub-multiple or multiple of the number of rows [2]數據長度9不是行數2的因數或倍數
哇哦,我有一些額外的發現
報錯信息的數字會用[]標識出來,是有意義的。同時本身也不是特別難懂。
興奮完之后,回到命令本身,參數解釋如下:
我們可以看到,在矩陣里,名稱就非常重要了,它更接近于我們平常做數據分析時所需要使用的表。
注意:看到那個TRUE了沒,對比一下C里的true和python里的True就知道,R語言也是一個大小寫敏感的語言。因此要注意代碼的嚴格的大小寫。
注意:第三,四個參數不是必需的,第三個不寫的話,默認是FALSE,也就是按列填充。(和TeX的語法差別在于,可選不可選并不能通過直觀的方式看出來,需要靠人的主觀能動性去理解)
注意:在dimnames里有一個list函數,這是為了創建列表,它的目的是把多個變量的集合聚合成為單個變量,這是為了方便給函數的參數提供值,傳參時會經常用。形式上倒沒有太大的差別。
下面是第二個例子。
cbind(A=1:4,B=5:8,C=9:12)
rbind(A=1:4,B=5:8,C=9:12)
顯示的結果如下
bind是捆綁的意思,cbind理解為“把列捆綁在一起”,所以提供的向量自然是列向量,那么對應的名稱索引就是行索引。同樣的,rbind就是“把行捆綁在一起”。
注意:有的人會問[1,]和[,1]是什么?我們要強調,這種位置上的東西不管是名稱還是數字,都是索引!但是這是矩陣的索引,對于矩陣的索引,我們可以舉幾個例子。
A=matrix(1:24,nrow=4,ncol=6)
A[,6]
A[3,]
A[3,4]
B=A[c(2,3),c(3,4)]
B
dimnames(B)=list(c(1,2),c(1,2))
B
顯示的結果如下
索引項中,第一個是行索引,第二個是列索引。同樣,你也可以給索引設置為向量。
在敲這個代碼的時候,摸索了一個很有趣的用法。我們注意到,B依然是一個矩陣,但是使用matrix是創建一個矩陣,如果我要修改B這個矩陣的參數怎么辦呢?就可以使用paramater(B)=,其中paramater是在函數中的參數,可以通過這種方法賦值。
注意:1:4,5:8等等,這個是什么?根據例子可以看出,這會生成1:4的公差為1的等差數列。你不用去擔心看不懂,我會點出來,然后告訴你,這些有趣的用法在之后的筆記中會講解到。
接著說數組,R中給的定義是多于2維的向量。我們拿矩陣去做對比,對數組就很好理解了。
同樣舉個例子
A <- c('A','B')
B <- c(1,2,3)
C <- c('!','@','#','
)
z <- array(1:24,c(2,3,4),dimnames=list(A,B,C))
z
顯示的結果如下
我們可以看出,第三維是單獨被拉出來的,第一二維就是行和列。第三維我們一般稱為頁。
有了矩陣鋪墊,這個每個參數的含義就好理解多了,但我們還是做一個簡單的解釋。
注意:我還沒有找到讓數組元素按行填充的辦法。可能本身就沒有設置吧。
注意:在介紹matrix函數的時候,每一個參數都是paramater=...的形式,但是這里似乎不是。在R里,如果不加這樣的形式,R會按默認的參數順序設置,如果記不住就很容易亂。使用這樣的形式可以防止這個問題(同樣在python,C++里也可以這么做,其中python里叫已知參數)當然不是因為它沒有paramater,這只是寫的人的習慣,因為這三個參數不容易混(性質完全不同),所以用熟的人自然不會再想著加paramater本身。
好的,問題來了,如果我是小白呢?我想加paramater怎么辦?
乖,讓你的心到最開始的地方看看?
再次強調,不要忽略所有注意的地方!我已經寫了很長時間了,但是實際上回到書本,其實只是書本一二兩章的內容的部分。還有很多有趣的東西還沒有涉及到,因此這只是基本操作總覽的第一部分。我們會在之后的筆記涉及到剩下的部分。
下一節我們會說函數,常用函數集合,向量中的因子,排序,數據框,存儲與導入外部數據等其余的基本操作。
感謝支持我的各位!筆芯~~
TML 代碼約定
很多 Web 開發人員對 HTML 的代碼規范知之甚少。
在2000年至2010年,許多Web開發人員從 HTML 轉換到 XHTML。
使用 XHTML 開發人員逐漸養成了比較好的 HTML 編寫規范。
而針對于 HTML5 ,我們應該形成比較好的代碼規范,以下提供了幾種規范的建議。
使用正確的文檔類型
文檔類型聲明位于HTML文檔的第一行:
<!DOCTYPE html>
如果你想跟其他標簽一樣使用小寫,可以使用以下代碼:
<!doctype html>
使用小寫元素名
HTML5 元素名可以使用大寫和小寫字母。
推薦使用小寫字母:
混合了大小寫的風格是非常糟糕的。
開發人員通常使用小寫 (類似 XHTML)。
小寫風格看起來更加清爽。
小寫字母容易編寫。
不推薦:
<SECTION>
<p>這是一個段落。</p>
</SECTION>
非常糟糕:
<Section>
<p>這是一個段落。</p>
</SECTION>
推薦:
<section>
<p>這是一個段落。</p>
</section>
關閉所有 HTML 元素
在 HTML5 中, 你不一定要關閉所有元素 (例如 <p> 元素),但我們建議每個元素都要添加關閉標簽。
不推薦:
<section>
<p>這是一個段落。
<p>這是一個段落。
</section>
推薦:
<section>
<p>這是一個段落。</p>
<p>這是一個段落。</p>
</section>
關閉空的 HTML 元素
在 HTML5 中, 空的 HTML 元素也不一定要關閉:
我們可以這么寫:
<meta charset="utf-8">
也可以這么寫:
<meta charset="utf-8" />
在 XHTML 和 XML 中斜線 (/) 是必須的。
如果你期望 XML 軟件使用你的頁面,使用這種風格是非常好的。
使用小寫屬性名
HTML5 屬性名允許使用大寫和小寫字母。
我們推薦使用小寫字母屬性名:
同時使用大小寫是非常不好的習慣。
開發人員通常使用小寫 (類似 XHTML)。
小寫風格看起來更加清爽。
小寫字母容易編寫。
不推薦:
<div CLASS="menu">
推薦:
<div class="menu">
屬性值
HTML5 屬性值可以不用引號。
屬性值我們推薦使用引號:
如果屬性值含有空格需要使用引號。
混合風格不推薦的,建議統一風格。
屬性值使用引號易于閱讀。
以下實例屬性值包含空格,沒有使用引號,所以不能起作用:
<table class=table striped>
以下使用了雙引號,是正確的:
<table class="table striped">
圖片屬性
圖片通常使用 alt 屬性。 在圖片不能顯示時,它能替代圖片顯示。
<img src="html5.gif" alt="HTML5" style="width:128px;height:128px">
定義好圖片的尺寸,在加載時可以預留指定空間,減少閃爍。
<img src="html5.gif" alt="HTML5" style="width:128px;height:128px">
空格和等號
等號前后可以使用空格。
<link rel="stylesheet" href="styles.css">
但我們推薦少用空格:
<link rel="stylesheet" href="styles.css">
避免一行代碼過長
使用 HTML 編輯器,左右滾動代碼是不方便的。
每行代碼盡量少于 80 個字符。
空行和縮進
不要無緣無故添加空行。
為每個邏輯功能塊添加空行,這樣更易于閱讀。
縮進使用兩個空格,不建議使用 TAB。
比較短的代碼間不要使用不必要的空行和縮進。
不必要的空行和縮進:
<body>
<h1>菜鳥教程</h1>
<h2>HTML</h2>
<p>
菜鳥教程,學的不僅是技術,更是夢想。
菜鳥教程,學的不僅是技術,更是夢想。
菜鳥教程,學的不僅是技術,更是夢想,
菜鳥教程,學的不僅是技術,更是夢想。
</p>
</body>
推薦:
<body>
<h1>菜鳥教程</h1>
<h2></h2>
<p>菜鳥教程,學的不僅是技術,更是夢想。
菜鳥教程,學的不僅是技術,更是夢想。
菜鳥教程,學的不僅是技術,更是夢想。
菜鳥教程,學的不僅是技術,更是夢想。</p>
</body>
表格實例:
<table>
<tr>
<th>Name</th>
<th>Description</th>
</tr>
<tr>
<td>A</td>
<td>Description of A</td>
</tr>
<tr>
<td>B</td>
<td>Description of B</td>
</tr>
</table>
列表實例:
<ol>
<li>London</li>
<li>Paris</li>
<li>Tokyo</li>
</ol>
省略 <html> 和 <body>?
在標準 HTML5 中, <html> 和 <body> 標簽是可以省略的。
以下 HTML5 文檔是正確的:
實例:
<!DOCTYPE html>
<head>
<title>頁面標題</title>
</head>
<h1>這是一個標題</h1>
<p>這是一個段落。</p>
嘗試一下 ?
不推薦省略 <html> 和 <body> 標簽。
<html> 元素是文檔的根元素,用于描述頁面的語言:
<!DOCTYPE html>
<html lang="zh">
聲明語言是為了方便屏幕閱讀器及搜索引擎。
省略 <html> 或 <body> 在 DOM 和 XML 軟件中會崩潰。
省略 <body> 在舊版瀏覽器 (IE9)會發生錯誤。
省略 <head>?
在標準 HTML5 中, <head>標簽是可以省略的。
默認情況下,瀏覽器會將 <body> 之前的內容添加到一個默認的 <head> 元素上。
實例
<!DOCTYPE html>
<html>
<title>頁面標題</title>
<body>
<h1>這是一個標題</h1>
<p>這是一個段落。</p>
</body>
</html>
嘗試一下 ?
現在省略 head 標簽還不推薦使用。 |
元數據
HTML5 中 <title> 元素是必須的,標題名描述了頁面的主題:
<title>菜鳥教程</title>
標題和語言可以讓搜索引擎很快了解你頁面的主題:
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<title>菜鳥教程</title>
</head>
HTML 注釋
注釋可以寫在 <!-- 和 --> 中:
<!-- 這是注釋 -->
比較長的評論可以在 <!-- 和 --> 中分行寫:
<!--
這是一個較長評論。 這是 一個較長評論。這是一個較長評論。
這是 一個較長評論 這是一個較長評論。 這是 一個較長評論。
-->
長評論第一個字符縮進兩個空格,更易于閱讀。
樣式表
樣式表使用簡潔的語法格式 ( type 屬性不是必須的):
<link rel="stylesheet" href="styles.css">
短的規則可以寫成一行:
p.into {font-family: Verdana; font-size: 16em;}
長的規則可以寫成多行:
body {
background-color: lightgrey;
font-family: "Arial Black", Helvetica, sans-serif;
font-size: 16em;
color: black;
}
將左花括號與選擇器放在同一行。
左花括號與選擇器間添加以空格。
使用兩個空格來縮進。
冒號與屬性值之間添加已空格。
逗號和符號之后使用一個空格。
每個屬性與值結尾都要使用符號。
只有屬性值包含空格時才使用引號。
右花括號放在新的一行。
每行最多 80 個字符。
在逗號和分號后添加空格是常用的一個規則。 |
在 HTML 中載入 JavaScript
使用簡潔的語法來載入外部的腳本文件 ( type 屬性不是必須的 ):
<script src="myscript.js">
使用 JavaScript 訪問 HTML 元素
一個糟糕的 HTML 格式可能會導致 JavaScript 執行錯誤。
以下兩個 JavaScript 語句會輸出不同結果:
實例
var obj=getElementById("Demo")
var obj=getElementById("demo")
HTML 中 JavaScript 盡量使用相同的命名規則。
訪問 JavaScript 代碼規范。
使用小寫文件名
大多 Web 服務器 (Apache, Unix) 對大小寫敏感: london.jpg 不能通過 London.jpg 訪問。
其他 Web 服務器 (Microsoft, IIS) 對大小寫不敏感: london.jpg 可以通過 London.jpg 或 london.jpg 訪問。
你必須保持統一的風格,我們建議統一使用小寫的文件名。
文件擴展名
HTML 文件后綴可以是 .html (或r .htm)。
CSS 文件后綴是 .css 。
JavaScript 文件后綴是 .js 。
.htm 和 .html 的區別
.htm 和 .html 的擴展名文件本質上是沒有區別的。瀏覽器和 Web 服務器都會把它們當作 HTML 文件來處理。
區別在于:
.htm 應用在早期 DOS 系統,系統現在或者只能有三個字符。
在 Unix 系統中后綴沒有特別限制,一般用 .html。
技術上區別
如果一個 URL 沒有指定文件名 (如 http://www.runoob.com/css/), 服務器會返回默認的文件名。通常默認文件名為 index.html, index.htm, default.html, 和 default.htm。
如果服務器只配置了 "index.html" 作為默認文件,你必須將文件命名為 "index.html", 而不是 "index.htm"。
但是,通常服務器可以設置多個默認文件,你可以根據需要設置默認文件嗎。
不管怎樣,HTML 完整的后綴是 ".html"。
如您還有不明白的可以在下面與我留言或是與我探討QQ群308855039,我們一起飛!
*請認真填寫需求信息,我們會在24小時內與您取得聯系。