title: "R的學(xué)習(xí)筆記03"
author: "ks_c"
date: "2021/1/28"
output: html_document
????昨日在bookdown網(wǎng)站上看到一本書R數(shù)據(jù)分析指南與速查手冊(cè),看起來(lái)挺不錯(cuò),奈何網(wǎng)絡(luò)奇差,每次打開(kāi)bookdown網(wǎng)站時(shí)都花費(fèi)不少時(shí)間,又無(wú)法直接下載,故在閱讀過(guò)程中做記錄于此。后時(shí)若用到,則不必費(fèi)力再登陸彼網(wǎng)站。
郭曉,R 數(shù)據(jù)分析指南與速查手冊(cè),bookdown.org
<font face="宋體">以下為第一章的內(nèi)容。</font>
1. 快捷鍵
- 腳本編輯窗口:
- 新建腳本:Ctrl+Shift+N
- 代碼提示與補(bǔ)全:Tab
- 注釋或取消注釋:Ctrl+Shift+C
- 運(yùn)行所選代碼:Ctrl+Enter
- 運(yùn)行全部代碼:Ctrl+Shift+Enter
- 全選:Ctrl+A
- 選擇:Shift+箭頭
- 刪除行:Ctrl+D
- 撤銷:Ctrl+Z
- 重做:Ctrl+Shift+Z
- 賦值符:Alt+-
- 代碼折疊:Alt+L
- 代碼展開(kāi):Shift+Alt+L
- 保存本腳本:Ctrl+S
- 保存全部腳本:Ctrl+Alt+S
- 增加縮進(jìn):選中代碼后,Tab(可包括多行)
- 減小縮進(jìn):選中代碼后,Shift+Tab
- 智能縮進(jìn):選中代碼后,Ctrl+I
- 智能縮進(jìn)加智能空格:Ctrl+Shift+A(更高級(jí)的代碼格式規(guī)范化工具,可參考formatR包)
- 選擇與替換:Ctrl+F
- 提取函數(shù):Ctrl+Alt+X(RStudio 可以分析某一代碼段,并自動(dòng)將其轉(zhuǎn)換成一個(gè)可- 重復(fù)使用的函數(shù)。任何在選擇的代碼內(nèi)的“自由的”變量,即那些被引用但沒(méi)有被創(chuàng)建的變量,將被轉(zhuǎn)化為函數(shù)的參數(shù))
- 命令窗口中:
- 歷史中的上一條命令:向上箭頭
- 歷史中的下一條命令:向下箭頭
- 中斷運(yùn)行的代碼:Esc
- 清除命令窗口中的內(nèi)容:Ctrl+L
2.常見(jiàn)運(yùn)算符
| 運(yùn)算符 | 含義 |
|---|---|
| [ ] [[ ]] | 索引(關(guān)于兩者之間差異請(qǐng)見(jiàn)這篇筆記 ) |
| :: ::: | 使用名稱訪問(wèn)變量(一般使用::) |
| $ @ | 元素提取、位置提取(更常用$) |
| ^ | 乘方 |
| - + | 負(fù)、正 |
| : | 創(chuàng)建數(shù)列(x<-c(1:10)#創(chuàng)建1到10的一個(gè)數(shù)列) |
| %任意% | 特殊運(yùn)算符 |
a%in%b#判斷a是否在b中,返回T or F |
|
%>%管道符號(hào),見(jiàn)這里
|
|
| * / | 乘、除 |
| + - | 加、減 |
| ==、!=、<、>、<=、>= | 比較運(yùn)算符 |
| ! | 邏輯非 |
| &、&& | 邏輯與 |
| I (豎線,enter上遍的鍵那個(gè)) | 邏輯或 |
| ~ | 非,與!=等價(jià) |
| -> 、->> | 向右賦值 |
| = | 賦值(右邊變量的值給左邊變量) |
| <- 、<<- | 賦值(同上) |
| ? | 幫助 |
3. 關(guān)于換行
分號(hào); 一行執(zhí)行多條命令(誰(shuí)會(huì)用呢)
a <- 1;b <- 2
a
[1] 1
b
[1] 2
paste0( )函數(shù):來(lái)凝結(jié)多行字符串:
string1 <- "this is a long string
+ with a ‘\n’ "
[1] "this is a long string \nwith \n"
#如果賦值時(shí)直接在字符串中分行,那么最終會(huì)出現(xiàn)一個(gè)換行符"\n"
a <- paste0('this is the first line ',
+ 'this is the second line')
a
[1] "this is the first line this is the second line"
#如果用paste0()函數(shù)則不會(huì)出現(xiàn)
paste()和paste0()之間的區(qū)別在于:
paste(..., collapse ="" , recycle0 =F)
paste(..., sep="", collapse ="" , recycle0 =F)函數(shù)中多了一個(gè)sep參數(shù),用來(lái)設(shè)置分隔符。
4. ifelse控制語(yǔ)句
類似Excel中的=if()函數(shù)。
在Excel中,=if(條件,值為T則,值為F則),在Rstudio中可以用ifelse()函數(shù)實(shí)現(xiàn)。
x <- c(6:-4)
y <- sqrt(ifelse(x >= 0, x, NA))#如果x大于0,那么就取x的值進(jìn)行計(jì)算,否則就是NA。
x
[1] 6 5 4 3 2 1 0 -1 -2 -3 -4
y
[1] 2.449490 2.236068 2.000000 1.732051 1.414214 1.000000
[7] 0.000000 NA NA NA NA
多重套娃
a <- ifelse(value1, value1_if_true,
ifelse(value2, value2_if_true,
ifelse(value3, value3_if_true,
value_if_false)))
5. switch()函數(shù)
switch(EXPR, x1, x2, x3, ...., xn ):數(shù)值EXPR為幾,就返回x1到xn中的第幾個(gè)。0<EXPR<=n,否則就會(huì)返回NULL[1]。
x <- switch(1,'missile', 'cancle', 'dissle')
x
[1] "missile"
x <- switch(4,'missile', 'cancle', 'dissle')
x
NULL
如果后面不是字符串而是變量,那么返回的值為該變量(該變量?jī)?nèi)所有值),而非返回該向量?jī)?nèi)的第幾個(gè)元素(哪怕只有一個(gè)向量時(shí))
y <- c('missile', 'cancle', 'dissle')
z <- c('pissile','bassle')
x <- switch(2,y,z)
x
[1] "pissile" "bassle"
y <- c('missile', 'cancle', 'dissle')
x <- switch(1,y)
x
[1] "missile" "cancle" "dissle"
字符串來(lái)說(shuō),其用法如下:
switch(condition.string,
case.str1=ret1,
case.str2=ret2,
case.str2=ret2,
...)
而最后返回的值為和condition.string匹配的case.str的ret的值
s <- "color"
switch(s, "color" = "red", "shape" = "square", "length" = 5)
[1] "red"
6. 循環(huán)語(yǔ)句:for、while、repeat
6.1 for
for (variable in vector) {
function
}
vector為向量或列表,variable依次變成vector中的值,然后對(duì)其進(jìn)行操作。
function為要進(jìn)行的操作。
(直接摘抄的)例子:
a <- double(5) #產(chǎn)生5個(gè)0
for (i in 1:length(a)) {
a[i] <- i^2
} #length(a)為5,令i依次取1到5,然后a的第i個(gè)元素a[i]被賦值為i^2
a
[1] 1 4 9 16 25
b <- list("Appale",1,FALSE) #b為列表
item <- character() # item為字符串變量
for (i in b) { # i依次取b中元素,
item <- c(item,mode(i)) #mode()為判斷元素類別
} #利用mode()判斷 i 的類別,新的item變量為舊item變量加上mode(i)
item.mode
[1] "character" "numeric" "logical"
始終要記住,R是一款newbeer的統(tǒng)計(jì)軟件而非newbeer的編程軟件。
利用向量化的操作比用循環(huán)對(duì)元素進(jìn)行操作要更高效,且代碼更加簡(jiǎn)潔。能用向量化的操作時(shí)應(yīng)避免用循環(huán)操作。
以上代碼用向量化操作可以寫為:
b <- list("Appale",1,FALSE)
item.mode <- sapply(b,mode)#
sapply()函數(shù):類似于lapply函數(shù),但輸入為列表,返回值為向量
sapply(X, FUN, ..., )
X:列表、矩陣、數(shù)據(jù)框
FUN:自定義的調(diào)用函數(shù)
sapply(b, sum)# 求列表中各元素的和
sapply(b,mode)# 判斷各元素類型
6.2 while
當(dāng)條件cond滿足時(shí),重復(fù)執(zhí)行表達(dá)式expr,直到條件cond不滿足為止。
while (cond) {
expr
}
例子:
i <- 1
while (i < 6) {
print(i)
i = i + 1
}
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
6.3 repeat
repeat{}和rep()函數(shù)不同。
rep(x,times,length.out,each) 函數(shù):將x重復(fù)times次,或者重復(fù)到length.out的長(zhǎng)度
a <- 2:8
rep(a,times=2)
[1] 2 3 4 5 6 7 8 2 3 4 5 6 7 8
rep(a,length.out=2)#重復(fù)結(jié)果的長(zhǎng)度為2
[1] 2 3
rep(a,each=2)#每個(gè)值重復(fù)兩次
[1] 2 2 3 3 4 4 5 5 6 6 7 7 8 8
rep(a, each=3,length.out=10)
[1] 2 2 2 3 3 3 4 4 4 5
而repeat{}則是重復(fù)執(zhí)行花括號(hào)內(nèi)的命令
x <- 1
repeat {
print(x)
x <- x + 1
if (x == 6) {
break
}
}
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
7. 定義函數(shù)
形式如下:
FuncName <- function (arglist) {
expr
return(value)
}
argilist:參數(shù)列表,用, 隔開(kāi)。
expr:要執(zhí)行的命令。
return():給出返回結(jié)果,如果不寫return語(yǔ)句,則將函數(shù)最后一個(gè)賦值語(yǔ)句作為返回值。如果不想返回任何對(duì)象,則可以將return的參數(shù)空缺,即寫為return()。
當(dāng)使用參數(shù)時(shí),如果沒(méi)有指定參數(shù)名,則按順序賦值,如果指定了參數(shù)名,可以不按順序賦值。對(duì)于已經(jīng)指定了默認(rèn)值的參數(shù),可以在使用時(shí)不指定參數(shù)值。
類似python,不再介紹。
8. R包
常用的R包:可參考 https://support.rstudio.com/hc/en-us/articles/201057987-Quick-list-of-useful-R-packages
按應(yīng)用領(lǐng)域分類的R包,可參考 https://cran.r-project.org/web/views/
- 包的安裝:用install.packages("包的名字")
- 包的加載:用library(包的名字)
- 從環(huán)境中移除包:detach("package:包的名字", unload=TRUE)
- 卸載包:remove.packages("包的名字")
<center><h1> 9. 常用函數(shù)</h1></center>
9.1. 常用數(shù)學(xué)函數(shù)
| 函數(shù) | 描述 |
|---|---|
| abs(x) | 絕對(duì)值 |
| sqrt(x) | 開(kāi)平方 |
| ceiling(x) | 向上取整 |
| floor(x) | 向下取整 |
| trunc(x) | 0-x的整數(shù)部分 |
| round(x,digits=n) | 舍入至n位小數(shù) |
| signif(x,digits=n) | 該數(shù)字一共n個(gè)數(shù)(整數(shù)+小數(shù)) |
| cos(x) & sin(x) & tan(x) | 三角函數(shù) |
| acos(x) & asin(x) & atan(x) | 反三角函數(shù) |
| log(x,base=n) | 取以n為底,x的對(duì)數(shù) |
| log10(x) | 以10為底,x的對(duì)數(shù) |
| exp(x) | 指數(shù)函數(shù):以e為底的指數(shù) |
9.2. 統(tǒng)計(jì)函數(shù)
| 函數(shù) | 描述 |
|---|---|
| mean(x) | 均值 |
| media(x) | 中位數(shù) |
| sd(x) / var(x) | 標(biāo)準(zhǔn)差/方差 |
| mad(x) | 絕對(duì)中位差 |
| quantile(x, probs) | 分位數(shù) |
| range(x) | 全域 |
| sum(x) | 求和 |
| diff(x, lag=n) | 滯后n位的滯后差分…[1] |
| min(x)/max(x) | 極值 |
| scale(x, center=T, scale=T) | 中心化/標(biāo)準(zhǔn)化處理[2] |
| cov(x) | 協(xié)方差 |
[1] : 滯后差分:
x<-c(1,5,23,29)
diff(x)
[ 1 ] 4,8,6
[2] : scale(x):標(biāo)準(zhǔn)化;scale(x,scale=F):中心化。
9.3概率函數(shù)
概率函數(shù)分為4類:密度函數(shù)、分布函數(shù)、分位數(shù)函數(shù)、生成隨機(jī)數(shù)。
根據(jù)不同的分布,又分為正態(tài)分布、均勻分布等等,二者組合成為具體的函數(shù),在R中,前面4種類型用下面字母打頭,之后的函數(shù)如下表所示:
d = 密度函數(shù)( density,y軸的值)
p = 分布函數(shù)( distribution function)
q = 分位數(shù)函數(shù)( quantile function)
r = 生成隨機(jī)數(shù)(隨機(jī)偏差Random error)
| 縮寫 | 分布名稱 |
|---|---|
| norm | 正態(tài)分布 |
| t | t分布 |
| chisq | 卡方分布 |
| f | F分布 |
| unif | 均勻分布 |
| logis | 邏輯分布 |
| singrank | wilcoxon符號(hào)秩和分布 |
| wilcox | wilcoxon秩和分布 |
| beta | Beta分布 |
| binom | 二項(xiàng)分布 |
| exp | 指數(shù)分布 |
| geom | 幾何分布 |
| pois | 泊松分布 |
對(duì)數(shù)
其余詳見(jiàn)下圖

概率為0.95的N~(0,1)的分位數(shù)為1.64
qnorm(p=0.95,mean=0,sd=1)
[1] 1.644854
概率為0.99的N~(0,1)的分位數(shù)為1.64
qnorm(p=0.99, mean=0, sd=1)
[1] 2.326348
分位數(shù)為1.64的N~(0,1)的概率為0.95
pnorm(q = 1.64,0,1)
[1] 0.9494974
pnorm()和qnorm()之間的值可以互相轉(zhuǎn)化
runif(n, min, max)為隨機(jī)(r)生成符合均勻分布(unif)的n個(gè)數(shù)據(jù),并不是run if。
9.4. 工作空間函數(shù)
在R中,所有反斜杠\代表轉(zhuǎn)義,工作路徑用兩個(gè)反斜杠或者正斜杠。

ls(all.names=TRUE): 得到包含隱藏變量(以點(diǎn)開(kāi)頭的變量)的列表。
.Last.value:得到上次運(yùn)行的結(jié)果
search(): 查看已經(jīng)載入的包。
library():查看已經(jīng)安裝的包。
data(dsname,package="pkgname"):不載入某個(gè)包的情況下,使用該包的某個(gè)數(shù)據(jù)
9.5. 幫助函數(shù)
獲取函數(shù)的幫助:?后接函數(shù)名,函數(shù)可不加括號(hào),顯示函數(shù)的幫助文檔。
獲取包的幫助:用命令help(package="包的名字")。
獲取函數(shù)源代碼:命令窗口中輸入函數(shù),不加括號(hào)并回車后
? 有時(shí)候這個(gè)函數(shù)可能是一個(gè)類函數(shù)(Generic Function),如plot函數(shù),則先使用methods() 函數(shù)來(lái)查看這個(gè)類函數(shù)的列表,找到具體需要的函數(shù)如plot.default,使用?plot.default進(jìn)行查看。
獲取特殊符號(hào)的幫助,如[[,if,用help("特殊符號(hào)")
其他幫助命令見(jiàn)下圖:

title: "R的學(xué)習(xí)筆記04"
author: "ks_c"
date: "2021/1/29"
output: html_document
<font face="宋體">以下為R數(shù)據(jù)分析指南與速查手冊(cè) 第二章的內(nèi)容</font>
2.1 向量
注意事項(xiàng)
- 向量?jī)?nèi)部的數(shù)據(jù)是同一類型
b <- c(1,'a')
b
[1] "1" "a" #這里的1和a都是字符串
typeof(b)
[1] "character"
- 可以個(gè)不存在的元素賦值,如果新賦值的元素與舊元素間有多個(gè)不存在的元素,那么這幾個(gè)元素將變成NA。
x <- 1:5
x[8] <- 6
x
[1] 1 2 3 4 5 NA NA 6
x["a"] <- 8
x
a
1 2 3 4 5 NA NA 6 8
- 元素名
b <- c(x1=1.2,3.5,x3=pi)
names(b)
[1] "x1" "" "x3"
b
x1 x3
1.200000 3.500000 3.141593
names(b)[2] <- "x2"
names(b)[1] <- "x1_0"
b
x1_0 x2 x3
1.200000 3.500000 3.141593
- 向量刪除
x <- c(0.5,1,100)
刪除第1個(gè)元素
x <- x[-1]
x
[1] 1 100
x <- x[-length(x)] # 刪除結(jié)尾元素
x
[1] 100
- 向量查詢
x[x>3.1&x<=8]
[1] 4 5 6 7 8
&、|、!為向量中各元素分別求“與”、“或”、“非”,而&&、| |為向量第一個(gè)元素求“與”、“或”。 如果要求向量?jī)?nèi)部所有元素求“與”,用函數(shù)all,如果要求向量?jī)?nèi)部所有元素求“或”,用函數(shù)any
c(T,T,F)&c(T,F,F)
[1] TRUE FALSE FALSE
c(T,T,F)&&c(T,F,F)
[1] TRUE
all(c(T,T,T))&T
[1] TRUE
all(c(T,T,F))&T
[1] FALSE
all(c(T,T,F))
[1] FALSE
all(c(T,T,T))
[1] TRUE
any(c(T,T,T))
[1] TRUE
any(T,T,F)
[1] TRUE
- %in%:判斷運(yùn)算符前面的對(duì)象的各元素是否在后面對(duì)象的元素中,返回值的長(zhǎng)度總與前面向量的長(zhǎng)度相同。如:
c("a","b") %in% c("b","d")
[1] FALSE TRUE
is.element(x, y)類似于x%in%y
x <- 1:4;y <- 3:5
is.element(x,y)
[1] FALSE FALSE TRUE TRUE
which函數(shù):不僅查詢滿足條件的值是多少,還可以查詢他們?cè)谠蛄恐械奈恢谩?br> 其用法為:
which(x, arr.ind = FALSE, useNames = TRUE)
x:邏輯向量,返回元素為TRUE的位置。
如果僅需知道第1個(gè)為TRUE的位置,在后面加一個(gè)[1]即可,例如:
x <- c(1:6)
x
[1] 1 2 3 4 5 6
which(x>3)
[1] 4 5 6
which(x>3)[1]
[1] 4
-排序
x <- c(5:1,6,pi)
x
[1] 5.000000 4.000000 3.000000 2.000000 1.000000
[6] 6.000000 3.141593
y1 <- x[order(x)]# order()函數(shù)從小到大排序
y1
[1] 1.000000 2.000000 3.000000 3.141593 4.000000
[6] 5.000000 6.000000
y2 <- x[order(x,decreasing = TRUE)] # 用order()函數(shù)從大到小排
y2
[1] 6.000000 5.000000 4.000000 3.141593 3.000000 2.000000 1.000000
y12 <- sort(x) # 用sort函數(shù)
y12
[1] 1.000000 2.000000 3.000000 3.141593 4.000000 5.000000 6.000000
y22 <- sort(x,decreasing = TRUE) #從大到小排
y22
[1] 6.000000 5.000000 4.000000 3.141593 3.000000 2.000000 1.000000
關(guān)于向量的其他常見(jiàn)函數(shù),請(qǐng)見(jiàn)troubleisafriend,
R語(yǔ)言常用數(shù)學(xué)函數(shù)
位置最大、最小值所在的位置用函數(shù)which.max和which.min
- 向量的翻轉(zhuǎn)
x <- seq(2,10,by=2)
x <- x[length(x):1]
x
[1] 10 8 6 4 2
x <- rev(x)
x
[1] 2 4 6 8 10
- 向量的集合運(yùn)算
交集:intersect(x, y);
并集:union(x, y);
差集:setdiff(x, y)[1];
集合是否相等:setequal(x, y);
確定元素是否是集合的某個(gè)元素:is.element(x, y),它等價(jià)于x %in% y
以上函數(shù)只能對(duì)兩個(gè)變量進(jìn)行計(jì)算。
使用Reduce(function, x, init, right = FALSE, accumulate = FALSE)函數(shù)[2]可以批量操作:
Reduce(intersect, list(a,b,d))
[1] : 除去a中b的部分(A-B)
[2] : 將x中第1、2元素進(jìn)行function操作,然后對(duì)操作完的值和第三個(gè)元素進(jìn)行function操作,知道用盡x內(nèi)的元素詳見(jiàn)
- 向量的算術(shù)運(yùn)算
- 加:+
- 減:-
- 乘:*
- 除:/
- 取模(余數(shù)):%%
- 整除:%/%
- 乘方:^或**
2.2. 簡(jiǎn)單列表
list可以為任意類型數(shù)據(jù),一般函數(shù)的輸出結(jié)果均為list。
任意幾個(gè)列表可以合成一個(gè)新列表。
- 列表的串聯(lián)和元素插入
如果我們需要讓兩個(gè)列表的元素組成新的列表,依然用函數(shù)c將多個(gè)列表連接起來(lái),返回的是列表而不是向量。
也可以用append()函數(shù)。
append(x, values, after = length(x))(
append函數(shù)也可用于向量,也是取向量values中的元素。
如果原列表的元素有名字,則新列表的元素繼承其名字,如果原列表元素沒(méi)有名字,在append函數(shù)中沒(méi)有添加名字的功能,可以在之后單獨(dú)用names()函數(shù)添加名字。
> x1 <- list(a=1,b="Apple",c=TRUE,d=1:3)
> x2 <- list(e=5+3i,f=c(1.5,2.6))
> # 列表的元素作為新列表的元素
> y1 <- append(x1,x2)
> y1
## $a
## [1] 1
##
## $b
## [1] "Apple"
##
## $c
## [1] TRUE
##
## $d
## [1] 1 2 3
##
## $e
## [1] 5+3i
##
## $f
## [1] 1.5 2.6
>length(y1)
[1] 6
y12 <- c(x1,x2)
y12
## $a
## [1] 1
##
## $b
## [1] "Apple"
##
## $c
## [1] TRUE
##
## $d
## [1] 1 2 3
##
## $e
## [1] 5+3i
##
## $f
## [1] 1.5 2.6
length(y12)
## [1] 6
# 向量的元素作為新向量的元素
y2 <- append(x1,1:5)
y2
## $a
## [1] 1
##
## $b
## [1] "Apple"
##
## $c
## [1] TRUE
##
## $d
## [1] 1 2 3
##
## [[5]]
## [1] 1
##
## [[6]]
## [1] 2
##
## [[7]]
## [1] 3
##
## [[8]]
## [1] 4
##
## [[9]]
## [1] 5
length(y2)
## [1] 9
# 列表本身作為新列表的元素
y3 <- list(x1,x2)
y3
## [[1]]
## [[1]]$a
## [1] 1
##
## [[1]]$b
## [1] "Apple"
##
## [[1]]$c
## [1] TRUE
##
## [[1]]$d
## [1] 1 2 3
##
##
## [[2]]
## [[2]]$e
## [1] 5+3i
##
## [[2]]$f
## [1] 1.5 2.6
length(y3)
## [1] 2
當(dāng)在append函數(shù)中指定after值的時(shí)候,可用于元素的插入
2.3 矩陣
矩陣本質(zhì)上是由維度的向量。向量能夠進(jìn)行的操作矩陣也可以進(jìn)行。
矩陣創(chuàng)建
matrix(data = , nrow = 1, ncol = 1, byrow = FALSE, dimnames = NULL)
byrow=F為按列進(jìn)行排列,在這里我詳細(xì)說(shuō)明。
矩陣的提取
[ ]內(nèi)只有一個(gè)參數(shù)時(shí)按列提取
x <- matrix(1:8,nrow=2,byrow=T)
x
[,1] [,2] [,3] [,4]
[1,] 1 2 3 4
[2,] 5 6 7 8
x[2]
5
length(x)
8
矩陣的拼接
橫向拼接:cbind,
縱向拼接:rbind,
被拼接的對(duì)象可以是矩陣,也可以是向量。他們?cè)谄唇臃较蛐枰邢嗤木S度。
#dim(x)可以查看維度
> dim(x)
[1] 2 4
當(dāng)橫向拼接向量時(shí),向量被視為行向量;當(dāng)縱向拼接向量時(shí),其被視為列向量。
m1 <- matrix(1:8,nrow = 2)
m2 <- matrix(1:4,nrow = 2)
m3 <- matrix(1:12,nrow = 3)
v1 <- 1:4
v2 <- 1:3
cbind(m1,m2)
## [,1] [,2] [,3] [,4] [,5] [,6]
## [1,] 1 3 5 7 1 3
## [2,] 2 4 6 8 2 4
rbind(m1,m3)
## [,1] [,2] [,3] [,4]
## [1,] 1 3 5 7
## [2,] 2 4 6 8
## [3,] 1 4 7 10
## [4,] 2 5 8 11
## [5,] 3 6 9 12
rbind(m1,v1)
## [,1] [,2] [,3] [,4]
## 1 3 5 7
## 2 4 6 8
## v1 1 2 3 4
cbind(m3,v2)
## v2
## [1,] 1 4 7 10 1
## [2,] 2 5 8 11 2
## [3,] 3 6 9 12 3
特殊矩陣的創(chuàng)建
- 全0矩陣(初始化)
matrix(data = 0, nrow = 2, ncol = 2)即可得到2 x 2的全部為0的矩陣
- 對(duì)角陣
diag(x = 1, nrow, ncol, names = TRUE)
- x可以是數(shù)字或矩陣或一維數(shù)組
- names=T:如果矩陣x 有名稱則繼承其名稱。
當(dāng)僅包含兩個(gè)參數(shù),第1個(gè)參數(shù)為單元素,第2個(gè)參數(shù)為整數(shù)n時(shí),表示創(chuàng)建n維對(duì)角矩陣,每個(gè)對(duì)角元素都為第1個(gè)參數(shù)。
第1個(gè)元素的類型可以是整數(shù)型、實(shí)數(shù)型、復(fù)數(shù)型或邏輯型,不能是字符串型。對(duì)邏輯型來(lái)說(shuō),非對(duì)角的地方為FALSE。
也可以創(chuàng)建對(duì)角線上元素不同的矩陣,此時(shí)將對(duì)角線上的元素以向量的方式作為diag的第一個(gè)參數(shù),矩陣的維度與該向量的長(zhǎng)度相同。如果指定維度,若對(duì)角線上元素長(zhǎng)度小于行數(shù)與列數(shù)中的最小值,指定對(duì)角線向量會(huì)復(fù)制多份首尾相連。
當(dāng)x為矩陣時(shí),則不可以指定nrow和ncol,直接輸出x對(duì)角線上的值。
> diag(x,length(x))
[,1] [,2] [,3] [,4]
[1,] 1 0 0 0
[2,] 0 2 0 0
[3,] 0 0 3 0
[4,] 0 0 0 4
x<- matrix(1:20)
> dim(x) <- c(4,5)
> x
[,1] [,2] [,3] [,4] [,5]
[1,] 1 5 9 13 17
[2,] 2 6 10 14 18
[3,] 3 7 11 15 19
[4,] 4 8 12 16 20
> diag(x)
[1] 1 6 11 16
行列名稱
m1 <- matrix(1:8,nrow = 2, dimnames = list(c("r1","r2"),c("c1","c2","c3","c4")))
m1
## c1 c2 c3 c4
## r1 1 3 5 7
## r2 2 4 6 8
rownames(m1) <- c("p1","p2")
m1
## c1 c2 c3 c4
## p1 1 3 5 7
## p2 2 4 6 8
row.names(m1) <- c("R1","R2")
m1
## c1 c2 c3 c4
## R1 1 3 5 7
## R2 2 4 6 8
dimnames(m1) <- list(c("rr1","rr2"),c("cc1","cc2","cc3","cc4"))
m1
## cc1 cc2 cc3 cc4
## rr1 1 3 5 7
## rr2 2 4 6 8
矩陣的提取
m2 <- m[1 , , drop = FALSE]
單行矩陣
矩陣轉(zhuǎn)置、翻轉(zhuǎn)、旋轉(zhuǎn)
轉(zhuǎn)置:
t(m1)
上下翻轉(zhuǎn):
m1[nrow(m1):1, ]
左右翻轉(zhuǎn):
m1[ ,ncol(m1):1]
順時(shí)針90度旋轉(zhuǎn):
t(apply(m1, 2, rev))
逆時(shí)針90度旋轉(zhuǎn):
t(apply(t(m1), 2, rev))
運(yùn)算


2.4 高維數(shù)組
數(shù)組是具有維度(dim)屬性的向量。矩陣是一種特殊的數(shù)組(一維)。
array(x, c(3, 4, 2))二維的兩個(gè)3 x 4的矩陣組成的數(shù)組
>x <- array(1:3, c(2,4,2))
## , , 1
##
## [,1] [,2] [,3] [,4]
## [1,] 1 3 2 1
## [2,] 2 1 3 2
##
## , , 2
##
## [,1] [,2] [,3] [,4]
## [1,] 3 2 1 3
## [2,] 1 3 2 1
數(shù)組拼接
abind包中的abind()函數(shù):abind(..., along=N)。
x
y<- x+100
#按行拼接
abind(x,y, along=1)
# 列方向拼接
abind(x,y, along=2)
# 頁(yè)方向拼接
abind(x,y, along=3)
# 新的維度上拼接,新維度作為第1維,之前的維度順次后移
abind(x,y, along=0)
2.5 數(shù)據(jù)框
數(shù)據(jù)框是一種特殊的列表,列表中每個(gè)元素都是一個(gè)有名字的向量,且這些向量的長(zhǎng)度相同。不同的向量可以是不同類型的。數(shù)據(jù)框是統(tǒng)計(jì)分析中最常用的數(shù)據(jù)結(jié)構(gòu)。
創(chuàng)建
name <- c("Alice","Bob","Christien")
age <- c(10,20,14)
gender <- c("F","M","F")
weight <- c(25,50,30)
df <- data.frame(name,age,gender,weight)
df
## name age gender weight
## 1 Alice 10 F 25
## 2 Bob 20 M 50
## 3 Christien 14 F 30
如果有字符串,dataframe中的字符串會(huì)被認(rèn)為是因子類型。用stringsAsFactor=F可以阻止變?yōu)樽址?/p>
所謂因子型,簡(jiǎn)單來(lái)說(shuō)是包含順序的字符串,順序可由用戶指定。在建模時(shí),會(huì)被作為整數(shù)處理。
# 抑制字符串向因子型的轉(zhuǎn)換
df2 <- data.frame(name,age,gender,weight,stringsAsFactors=FALSE)
df2
行名,列明的創(chuàng)建、提取和修改。
向量名被默認(rèn)作為數(shù)據(jù)框的列名。
矩陣列名也會(huì)默認(rèn)作為數(shù)據(jù)框列名。
如果數(shù)據(jù)框沒(méi)有指定列名,則列名默認(rèn)為“V1”、“V2”…,如果數(shù)據(jù)框沒(méi)有指定行名,則行名默認(rèn)為“1”、“2”、“3”…。
獲取數(shù)據(jù)框列名,可用names函數(shù)或colnames函數(shù)。
獲取數(shù)據(jù)框行名,可用row.names函數(shù)或rownames函數(shù)。
對(duì)數(shù)據(jù)框來(lái)說(shuō),row.names函數(shù)效率更高,因而推薦使用row.names函數(shù)。
在實(shí)際數(shù)據(jù)分析中,修改行名的做法很少見(jiàn),更多的是增加一個(gè)ID列,然后做相應(yīng)的修改。
提取數(shù)據(jù)時(shí)如果需要保持為單列數(shù)據(jù)框,可以添加drop = FALSE參數(shù)
# 給一個(gè)尚不存在的列賦值,即增加該列
df$new <- 1:4
df[5] <- NULL # 刪除該列
# 可以通過(guò)序號(hào)的方式增加1列
df[5] <- c(T,F,F,T)
df
df <- data.frame(name,age,gender,weight) # 注意此處字符串會(huì)轉(zhuǎn)化為因子型
df5 <- rbind(df3,df4)
df7 <- cbind(df1,df6)
#將相同的列合并,可以用merge函數(shù)
#merge函數(shù)會(huì)刪除重復(fù)的相同列,而且可以根據(jù)相同列的順序合并(相當(dāng)于Excel中的=vlookup)
條件查詢
subset(x, subset, select, drop=F)
subset參數(shù)可以提取行方面滿足條件
select參數(shù)可以為列方面選取的范圍
df2 <- subset(df,subset = name!="Einstein"&age>10,select = c(age:weight,height))
# !=為不等于
df2
排序
如果需要根據(jù)一列或多列的順序,對(duì)其他列做相應(yīng)的調(diào)整,可以使用order函數(shù)。如果需要將所有列都按降序排序,則增加decreasing = TRUE參數(shù)。如果大多數(shù)升序,某些降序,在降序的列前加-rank函數(shù)(如果是數(shù)值型,僅加負(fù)號(hào)就可以)。如果大多數(shù)降序,某些升序,在升序前加-rank函數(shù)函數(shù),且添加decreasing = TRUE參數(shù)。下面是一些列子:
name <- c("Alice","Bob","Christien","Einstein")
age <- c(10,20,14,25)
gender <- c("F","M","F","M")
weight <- c(25,50,30,54)
nationality <- c("USA","UK","China","German")
height <- c(1.2,1.65,1.43,1.75)
df <- data.frame(name,age,gender,weight,nationality,height)
#gender、weight兩列將序排列
df2 <- df[order(df$gender,df$weight,decreasing = TRUE),]
# gender降序,其余升序排列
# gender列前加一個(gè)-rank()就表示與默認(rèn)排序方式不同。
df3 <- df[order(-rank(df$gender),df$weight),]
#gender升序,weight降序(數(shù)值變量直接加-即可)
df4 <- df[order(df$gender,-df$weight),]
title: "R的學(xué)習(xí)筆記04"
author: "ks_c"
date: "2021/2/2"
output: html_document
<font face="宋體">以下為R數(shù)據(jù)分析指南與速查手冊(cè) 第三章的內(nèi)容</font>
導(dǎo)出
導(dǎo)出變量
使用save(..., list = character(),file = stop("'file' must be specified"))可以保存單個(gè)變量或一些變量。文件名為.rda或.Rdata。
- ...:要存儲(chǔ)的變量
- list:變量標(biāo)簽/名稱
- file:文件名及路徑
如果想保存整個(gè)環(huán)境,用save.image函數(shù)。常用用法為save.image(file = ".RData"),用file指定文件名即可。
導(dǎo)出txt或csv
導(dǎo)出為txt格式:
write.table(x, file = "",
append = FALSE,
quote = TRUE,
sep = " ",
eol = "\n",
na = "NA",
dec = ".",
row.names = TRUE,
col.names = TRUE,
qmethod = c("escape", "double"),
fileEncoding = "")
導(dǎo)出文件中:
- 字符串型數(shù)據(jù)將用引號(hào)括起來(lái),如果不想有引號(hào),可設(shè)置quote = FALSE。
(注意導(dǎo)出的csv文件中也是如此,只是如果用Excel打開(kāi)的話,其中的引號(hào)不顯示出來(lái),如果用文本查看器如Notepad++打開(kāi),就可以看到引號(hào)。) - 如果要保存的數(shù)據(jù)不是數(shù)據(jù)框格式,會(huì)被轉(zhuǎn)化為數(shù)據(jù)框格式,然后再保存為csv或txt文件。
- 導(dǎo)出文件中默認(rèn)包含行名(行序號(hào))和列名,如果不需要,在write.table中可以設(shè)定row.names = FALSE及col.names = FALSE,在write.csv中設(shè)定row.names=FALSE(在write.csv中,可以通過(guò)col.names給csv文件修改列名,但是不能取消其列名)。
- 更多參數(shù)設(shè)置,可查看write.table的幫助文檔。在write.csv中,會(huì)將行名與列名交叉格以空字符串輸出,但write.table會(huì)將其空缺。這會(huì)導(dǎo)致他們重新導(dǎo)入時(shí),對(duì)行名的處理不同。
# 數(shù)據(jù)生成
name <- c("Alice","Bob","Christien","Einstein")
age <- c(10,20,14,25)
gender <- c("F","M","F","M")
weight <- c(25,50,30,54)
nationality <- c("USA","UK","China","German")
height <- c(1.2,1.65,1.43,1.75)
example_df <- data.frame(name,age,gender,weight,nationality,height)
# 保存
write.csv(example_df, file = "example_df.csv")
write.table(example_df, file = "example_df.txt")
write.table(example_df, file = "example_df2.txt",quote = FALSE)#字符串沒(méi)有引號(hào)
導(dǎo)出圖片
直接保存而不展示圖片:
- 新建保存格式(稱之為一個(gè)圖形設(shè)備),如png、jpg、pdf(pdf是矢量圖),
- 運(yùn)行繪圖相關(guān)的代碼,
- 關(guān)閉圖形設(shè)備。
png("example_plot.png") # 新建一個(gè)圖片保存格式,png可以是jpg、pdf等
plot(1:10) # 繪圖
dev.off() # 關(guān)閉圖形設(shè)備
圖片的長(zhǎng)、寬、分辨率等參數(shù)可參考png等的幫助文檔。
如果已經(jīng)畫好了圖,可以使用如下代碼輸出到文件中。
dev.copy(png, 'example_plot2.png')
dev.off()
如果最開(kāi)始打開(kāi)的是Windows窗口,則可用savePlot()函數(shù),其用法為:
savePlot(filename="Rplot",
type=c("wmf", "png", "jpeg", "jpg", "bmp", "ps"),
device=dev.cur())
#例子:
windows(width = 9, height = 9, rescale = "fit") # 打開(kāi)一個(gè)Windows窗口
plot(1:10,type = "l")
savePlot(filename="Myplot",type="pdf")
# savePlot(filename="Myplot",type="png")
## 支持下列格式:"wmf", "emf", "png", "jpg", "jpeg", "bmp", "tif", "tiff", "ps", "eps", "pdf"
dev.off()
導(dǎo)出文本
readr::write_file(txt, file_name.txt", append = FALSE)
writeLines(txt, con = fileConn,sep = "")
close(fileConn)
sink("cat.txt")
操作
sink()
cat(... = ,file = ,sep = ,fill = ,labels = ,append = )
fileConn<-file("writeChar.txt")
writeChar(txt, con = fileConn, eos = NULL, useBytes = FALSE)
close(fileConn)
writeChar
R與python通用的數(shù)據(jù)
feather
#R中
library(feather)
path <- "my_data.feather"
write_feather(df, path)
df <- read_feather(path)
#py中
import feather
path = 'my_data.feather'
feather.write_dataframe(df, path)
df = feather.read_dataframe(path)
數(shù)據(jù)載入
數(shù)據(jù)
read.table默認(rèn)的分隔符為空格,read.csv2默認(rèn)的分隔符為分號(hào);
可以改變默認(rèn)的分隔符。
read.csv(file,
header = TRUE,
sep = ",",
quote = """,
dec = ".",
fill = TRUE,
comment.char = "", ...)
按行或單元導(dǎo)入(表格數(shù)據(jù))
按行導(dǎo)入用readLines,按單元導(dǎo)入用scan
文本
整體讀取可用readr::read_file,
按行讀取可用readLines,如
txt<- read_file("write_file.txt")
title: "R的學(xué)習(xí)筆記04"
author: "ks_c"
date: "2021/2/2"
output: html_document
<font face="宋體">以下為R數(shù)據(jù)分析指南與速查手冊(cè) 第四章的內(nèi)容</font>
tidyverse包做探索性數(shù)據(jù)分析
- 數(shù)據(jù)變化
1 filter
2 select
3 arrange - 多表融合
- 增加新列
1 mutate
2 mutate與group_by
3 mutate_all
4 mutate_at
5 mutate_if - 數(shù)據(jù)匯總
1 summarise與group_by
2 summarise_all
3 summarise_at
4 summarise_if - 函數(shù)復(fù)用
- 可視化
1. 數(shù)據(jù)變換總結(jié)
- 行去重:distinct(.data, …, .keep_all = FALSE)
- 行篩選:filter()
- 列篩選:select()
- 行排序:arrange()
- 長(zhǎng)轉(zhuǎn)寬:spread(data, key=鍵所在列, value=鍵值所在列)
- 寬轉(zhuǎn)長(zhǎng):gather(data, 需要轉(zhuǎn)換的各列, key = “新建的鍵名”, value = “新建的鍵值名”)
- 列合并:unite(data, col=新列, 需要合并的各列, sep = "_", remove = TRUE)
- 列分裂:separate(data, col, into=c(“列1”,“列2”,…), sep = “[^[:alnum:]]+”)
- 嵌套與取消嵌套:nest()、unnest()
1.1 filter
filter進(jìn)行行篩選,各逗號(hào)分隔的條件需同時(shí)滿足,常用篩選條件有:
>, >=, <, <=, !=(不等于) , == ,near() , is.na(), %in%(前者是否在后者里面,返回值為T/F), between(x, left, right)
由于可能存在舍入誤差,浮點(diǎn)數(shù)最好不用 == 而用near。
&, |, !, xor()(異或)
1.2 select
進(jìn)行列篩選,各逗號(hào)分隔的條件任滿足其一即可,常用輔助篩選函數(shù)有:
:(從a列到b列), - (除了這些列)
starts_with()、ends_with()、contains()、matches()、num_range()、one_of()、everything()、last_col()
1.3 arrange
對(duì)行進(jìn)行排序,可以有多個(gè)排序條件,
降序:desc()
2. 多表融合總結(jié)
將兩個(gè)或多個(gè)表,通過(guò)共同的列聯(lián)結(jié)起來(lái),常見(jiàn)的操作包括:
- 左聯(lián)結(jié):left_join(x, y, by = NULL)
- 右聯(lián)結(jié):right_join(x, y, by = NULL)
- 內(nèi)聯(lián)結(jié):inner_join(x, y, by = NULL)
- 全聯(lián)結(jié):full_join(x, y, by = NULL)
- 半聯(lián)結(jié):semi_join(x, y, by = NULL)
- 反聯(lián)結(jié):anti_join(x, y, by = NULL)
- 多個(gè)表的聯(lián)結(jié):list(x1, x2, x3,…) %>% reduce(····_join, by = NULL)
將具有相同列的兩個(gè)表或多個(gè)表,對(duì)行進(jìn)行集合操作
- intersect(x, y, …)
- union(x, y, …)
- union_all(x, y, …)
- setdiff(x, y, …)
- setequal(x, y, …)
- list(x1, x2, x3,…) %>% reduce(*_join, by = NULL)
3. 增加新列總結(jié)
對(duì)原有的列進(jìn)行運(yùn)算,得到長(zhǎng)度與數(shù)據(jù)行數(shù)相同的新列。
分組與取消分組:group_by()、ungroup()
-
增加新列:
- mutate()
- mutate_all(.tbl, .funs, …)
- mutate_at(.tbl, .vars, .funs, …)
- mutate_if(.tbl, .predicate, .funs, …)
-
僅保留新列:
- transmute()
- transmute_all()
- transmute_at()
- transmute_if()
4. 數(shù)據(jù)匯總總結(jié)
分組對(duì)列進(jìn)行統(tǒng)計(jì)匯總,統(tǒng)計(jì)匯總函數(shù)一般含一個(gè)數(shù)據(jù)參數(shù),這個(gè)參數(shù)為代表多個(gè)觀測(cè)的向量,返回單個(gè)數(shù)值。當(dāng)返回多個(gè)值時(shí),可以將其轉(zhuǎn)換為list.
數(shù)據(jù)匯總(一般會(huì)與分組結(jié)合):
summarise()
summarise_all(.tbl, .funs, …)
summarise_if(.tbl, .predicate, .funs, …)
summarise_at(.tbl, .vars, .funs, …, .cols = NULL)
所有列采用相同匯總函數(shù)時(shí)也可用map()、map_*(),但其無(wú)法和group_by結(jié)合
對(duì)summarise系列函數(shù),若返回長(zhǎng)度大于1的向量,可用list將結(jié)果包圍。
5. 函數(shù)復(fù)用總結(jié)
單變量
返回列表:map(.x, .f, …)
返回 * 類型的向量:map_(.x, .f, …)( 可以是lgl、chr、int、dbl、raw)
得到輸出、打印、保存等其他動(dòng)作:walk()
返回?cái)?shù)據(jù)框:map_dfc(.x, .f, …), map_dfr(.x, .f, …, .id = NULL)
條件篩選,返回列表:map_if(.x, .p, .f, …, .else = NULL)、map_at(.x, .at, .f, …)
2維變量:map2(.x, .y, .f, …)、map2_(.x, .y, .f, …)等(沒(méi)有if和at)
p維變量:pmap(.l, .f, …)、pmap_(.x, .y, .f, …)等(沒(méi)有if和at)
遞歸復(fù)用:map_depth(.x, .depth, .f, …, .ragged = FALSE)
6. 可視化總結(jié)
ggplot圖層:
ggplot(data = <DATA>) +
<GEOM_FUNCTION>(
mapping = aes(<MAPPINGS>),
stat = <STAT>,
position = <POSITION>
) +
<COORDINATE_FUNCTION> +
<FACET_FUNCTION> +
<SCALE_FUNCTION> +
<THEME_FUNCTION>
GEOM_FUNCTION
離散變量頻次:geom_bar
連續(xù)變量頻次:geom_histogram、geom_freqpoly、 geom_density
離散vs連續(xù):geom_boxplot、geom_violin、并排geom_histogram
離散vs離散:geom_tile(熱力圖,顏色深淺表示頻次),geom_count(點(diǎn)的大小表示頻次)、并排geom_bar
連續(xù)vs連續(xù):geom_point、geom_bin2d(方形封箱)、geom_hex(6邊形封箱)、geom_smooth、geom_line、geom_density2d
3變量: geom_contour(aes(z = z))、geom_tile(aes(fill = z))、geom_raster(aes(fill = z))
MAPPINGS
x、y軸:x、y
點(diǎn)或邊框的顏色:color (顏色字符串)
填充顏色:fill (顏色字符串)
形狀:shape(最多6種,代表形狀的數(shù)字)
點(diǎn)的大小、線的粗細(xì):size (毫米為單位的數(shù)字)
透明度:alpha
線型:linetype(整數(shù)或字符串: 0 = blank, 1 = solid, 2 = dashed, 3 = dotted, 4 = dotdash, 5 = longdash, 6 = twodash)
邊框粗細(xì):stoke
group
STAT
“count”
“bin”
“identity”
“boxplot”
POSITION
“stack”:堆積
“identity”:獨(dú)立重疊
“dodge”:側(cè)面并列
“fill”:堆積歸一
“jitter”:擾動(dòng)
“dodge2”
COORDINATE_FUNCTION
coord_flip:坐標(biāo)翻轉(zhuǎn)
coord_fixed(ratio = 1/2):固定坐標(biāo)比例
coord_polar:極坐標(biāo)
coord_cartesian:笛卡爾坐標(biāo)(默認(rèn),可修改坐標(biāo)范圍)coord_cartesian(xlim = c(0, 5))
FACET_FUNCTION
單變量分面:facet_wrap
雙變量分面:facet_grid

第五章為R markdown的介紹,在