title: "R的學習筆記03"
author: "ks_c"
date: "2021/1/28"
output: html_document
????昨日在bookdown網站上看到一本書R數(shù)據分析指南與速查手冊舶吗,看起來挺不錯,奈何網絡奇差,每次打開bookdown網站時都花費不少時間姨丈,又無法直接下載炕婶,故在閱讀過程中做記錄于此裸影。后時若用到注整,則不必費力再登陸彼網站萍桌。
郭曉宵溅,R 數(shù)據分析指南與速查手冊,bookdown.org
<font face="宋體">以下為第一章的內容上炎。</font>
1. 快捷鍵
- 腳本編輯窗口:
- 新建腳本:Ctrl+Shift+N
- 代碼提示與補全:Tab
- 注釋或取消注釋:Ctrl+Shift+C
- 運行所選代碼:Ctrl+Enter
- 運行全部代碼:Ctrl+Shift+Enter
- 全選:Ctrl+A
- 選擇:Shift+箭頭
- 刪除行:Ctrl+D
- 撤銷:Ctrl+Z
- 重做:Ctrl+Shift+Z
- 賦值符:Alt+-
- 代碼折疊:Alt+L
- 代碼展開:Shift+Alt+L
- 保存本腳本:Ctrl+S
- 保存全部腳本:Ctrl+Alt+S
- 增加縮進:選中代碼后恃逻,Tab(可包括多行)
- 減小縮進:選中代碼后,Shift+Tab
- 智能縮進:選中代碼后藕施,Ctrl+I
- 智能縮進加智能空格:Ctrl+Shift+A(更高級的代碼格式規(guī)范化工具寇损,可參考formatR包)
- 選擇與替換:Ctrl+F
- 提取函數(shù):Ctrl+Alt+X(RStudio 可以分析某一代碼段,并自動將其轉換成一個可- 重復使用的函數(shù)裳食。任何在選擇的代碼內的“自由的”變量矛市,即那些被引用但沒有被創(chuàng)建的變量,將被轉化為函數(shù)的參數(shù))
- 命令窗口中:
- 歷史中的上一條命令:向上箭頭
- 歷史中的下一條命令:向下箭頭
- 中斷運行的代碼:Esc
- 清除命令窗口中的內容:Ctrl+L
2.常見運算符
運算符 | 含義 |
---|---|
[ ] [[ ]] | 索引(關于兩者之間差異請見這篇筆記 ) |
:: ::: | 使用名稱訪問變量(一般使用::) |
$ @ | 元素提取诲祸、位置提取(更常用$) |
^ | 乘方 |
- + | 負浊吏、正 |
: | 創(chuàng)建數(shù)列(x<-c(1:10)#創(chuàng)建1到10的一個數(shù)列 ) |
%任意% | 特殊運算符 |
a%in%b#判斷a是否在b中,返回T or F |
|
%>% 管道符號救氯,見這里
|
|
* / | 乘找田、除 |
+ - | 加、減 |
==径密、!=午阵、<躺孝、>享扔、<=底桂、>= | 比較運算符 |
! | 邏輯非 |
&、&& | 邏輯與 |
I (豎線惧眠,enter上遍的鍵那個) | 邏輯或 |
~ | 非籽懦,與!=等價 |
-> 、->> | 向右賦值 |
= | 賦值(右邊變量的值給左邊變量) |
<- 氛魁、<<- | 賦值(同上) |
? | 幫助 |
3. 關于換行
分號; 一行執(zhí)行多條命令(誰會用呢)
a <- 1;b <- 2
a
[1] 1
b
[1] 2
paste0( )函數(shù):來凝結多行字符串:
string1 <- "this is a long string
+ with a ‘\n’ "
[1] "this is a long string \nwith \n"
#如果賦值時直接在字符串中分行暮顺,那么最終會出現(xiàn)一個換行符"\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ù)則不會出現(xiàn)
paste()和paste0()之間的區(qū)別在于:
paste(..., collapse ="" , recycle0 =F)
paste(..., sep="", collapse ="" , recycle0 =F)函數(shù)中多了一個sep參數(shù),用來設置分隔符秀存。
4. ifelse控制語句
類似Excel中的=if()函數(shù)捶码。
在Excel中,=if(條件或链,值為T則惫恼,值為F則),在Rstudio中可以用ifelse()函數(shù)實現(xiàn)澳盐。
x <- c(6:-4)
y <- sqrt(ifelse(x >= 0, x, NA))#如果x大于0祈纯,那么就取x的值進行計算,否則就是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中的第幾個。0<EXPR<=n筛婉,否則就會返回NULL[1]簇爆。
x <- switch(1,'missile', 'cancle', 'dissle')
x
[1] "missile"
x <- switch(4,'missile', 'cancle', 'dissle')
x
NULL
如果后面不是字符串而是變量,那么返回的值為該變量(該變量內所有值)爽撒,而非返回該向量內的第幾個元素(哪怕只有一個向量時)
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"
字符串來說冕碟,其用法如下:
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)語句:for、while匆浙、repeat
6.1 for
for (variable in vector) {
function
}
vector為向量或列表安寺,variable依次變成vector中的值,然后對其進行操作首尼。
function為要進行的操作挑庶。
(直接摘抄的)例子:
a <- double(5) #產生5個0
for (i in 1:length(a)) {
a[i] <- i^2
} #length(a)為5,令i依次取1到5软能,然后a的第i個元素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)計軟件而非newbeer的編程軟件凳枝。
利用向量化的操作比用循環(huán)對元素進行操作要更高效,且代碼更加簡潔。能用向量化的操作時應避免用循環(huán)操作岖瑰。
以上代碼用向量化操作可以寫為:
b <- list("Appale",1,FALSE)
item.mode <- sapply(b,mode)#
sapply()函數(shù):類似于lapply函數(shù)叛买,但輸入為列表,返回值為向量
sapply(X, FUN, ..., )
X:列表蹋订、矩陣率挣、數(shù)據框
FUN:自定義的調用函數(shù)
sapply(b, sum)# 求列表中各元素的和
sapply(b,mode)# 判斷各元素類型
6.2 while
當條件cond滿足時,重復執(zhí)行表達式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重復times次荠锭,或者重復到length.out的長度
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)#重復結果的長度為2
[1] 2 3
rep(a,each=2)#每個值重復兩次
[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{}則是重復執(zhí)行花括號內的命令
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ù)列表谦炬,用, 隔開。
expr:要執(zhí)行的命令节沦。
return():給出返回結果键思,如果不寫return語句,則將函數(shù)最后一個賦值語句作為返回值甫贯。如果不想返回任何對象吼鳞,則可以將return的參數(shù)空缺,即寫為return()叫搁。
當使用參數(shù)時赔桌,如果沒有指定參數(shù)名,則按順序賦值渴逻,如果指定了參數(shù)名疾党,可以不按順序賦值。對于已經指定了默認值的參數(shù)惨奕,可以在使用時不指定參數(shù)值雪位。
類似python,不再介紹梨撞。
8. R包
常用的R包:可參考 https://support.rstudio.com/hc/en-us/articles/201057987-Quick-list-of-useful-R-packages
按應用領域分類的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ù)學函數(shù)
函數(shù) | 描述 |
---|---|
abs(x) | 絕對值 |
sqrt(x) | 開平方 |
ceiling(x) | 向上取整 |
floor(x) | 向下取整 |
trunc(x) | 0-x的整數(shù)部分 |
round(x,digits=n) | 舍入至n位小數(shù) |
signif(x,digits=n) | 該數(shù)字一共n個數(shù)(整數(shù)+小數(shù)) |
cos(x) & sin(x) & tan(x) | 三角函數(shù) |
acos(x) & asin(x) & atan(x) | 反三角函數(shù) |
log(x,base=n) | 取以n為底,x的對數(shù) |
log10(x) | 以10為底卧波,x的對數(shù) |
exp(x) | 指數(shù)函數(shù):以e為底的指數(shù) |
9.2. 統(tǒng)計函數(shù)
函數(shù) | 描述 |
---|---|
mean(x) | 均值 |
media(x) | 中位數(shù) |
sd(x) / var(x) | 標準差/方差 |
mad(x) | 絕對中位差 |
quantile(x, probs) | 分位數(shù) |
range(x) | 全域 |
sum(x) | 求和 |
diff(x, lag=n) | 滯后n位的滯后差分…[1] |
min(x)/max(x) | 極值 |
scale(x, center=T, scale=T) | 中心化/標準化處理[2] |
cov(x) | 協(xié)方差 |
[1] : 滯后差分:
x<-c(1,5,23,29)
diff(x)
[ 1 ] 4,8,6
[2] : scale(x):標準化时肿;scale(x,scale=F):中心化港粱。
9.3概率函數(shù)
概率函數(shù)分為4類:密度函數(shù)螃成、分布函數(shù)、分位數(shù)函數(shù)、生成隨機數(shù)寸宏。
根據不同的分布宁炫,又分為正態(tài)分布、均勻分布等等击吱,二者組合成為具體的函數(shù)淋淀,在R中遥昧,前面4種類型用下面字母打頭覆醇,之后的函數(shù)如下表所示:
d = 密度函數(shù)( density,y軸的值)
p = 分布函數(shù)( distribution function)
q = 分位數(shù)函數(shù)( quantile function)
r = 生成隨機數(shù)(隨機偏差Random error)
縮寫 | 分布名稱 |
---|---|
norm | 正態(tài)分布 |
t | t分布 |
chisq | 卡方分布 |
f | F分布 |
unif | 均勻分布 |
logis | 邏輯分布 |
singrank | wilcoxon符號秩和分布 |
wilcox | wilcoxon秩和分布 |
beta | Beta分布 |
binom | 二項分布 |
exp | 指數(shù)分布 |
geom | 幾何分布 |
pois | 泊松分布 |
對數(shù)
其余詳見下圖
概率為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()之間的值可以互相轉化
runif(n, min, max)為隨機(r)生成符合均勻分布(unif)的n個數(shù)據,并不是run if鞋仍。
9.4. 工作空間函數(shù)
在R中常摧,所有反斜杠\代表轉義,工作路徑用兩個反斜杠或者正斜杠威创。
ls(all.names=TRUE): 得到包含隱藏變量(以點開頭的變量)的列表落午。
.Last.value:得到上次運行的結果
search(): 查看已經載入的包。
library():查看已經安裝的包肚豺。
data(dsname,package="pkgname"):不載入某個包的情況下溃斋,使用該包的某個數(shù)據
9.5. 幫助函數(shù)
獲取函數(shù)的幫助:?后接函數(shù)名,函數(shù)可不加括號吸申,顯示函數(shù)的幫助文檔梗劫。
獲取包的幫助:用命令help(package="包的名字")。
獲取函數(shù)源代碼:命令窗口中輸入函數(shù)截碴,不加括號并回車后
? 有時候這個函數(shù)可能是一個類函數(shù)(Generic Function)梳侨,如plot函數(shù),則先使用methods() 函數(shù)來查看這個類函數(shù)的列表日丹,找到具體需要的函數(shù)如plot.default走哺,使用?plot.default進行查看。
獲取特殊符號的幫助哲虾,如[[割坠,if,用help("特殊符號")
其他幫助命令見下圖:
title: "R的學習筆記04"
author: "ks_c"
date: "2021/1/29"
output: html_document
<font face="宋體">以下為R數(shù)據分析指南與速查手冊 第二章的內容</font>
2.1 向量
注意事項
- 向量內部的數(shù)據是同一類型
b <- c(1,'a')
b
[1] "1" "a" #這里的1和a都是字符串
typeof(b)
[1] "character"
- 可以個不存在的元素賦值妒牙,如果新賦值的元素與舊元素間有多個不存在的元素彼哼,那么這幾個元素將變成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個元素
x <- x[-1]
x
[1] 1 100
x <- x[-length(x)] # 刪除結尾元素
x
[1] 100
- 向量查詢
x[x>3.1&x<=8]
[1] 4 5 6 7 8
&湘今、|敢朱、!為向量中各元素分別求“與”、“或”、“非”拴签,而&&孝常、| |為向量第一個元素求“與”、“或”蚓哩。 如果要求向量內部所有元素求“與”构灸,用函數(shù)all,如果要求向量內部所有元素求“或”岸梨,用函數(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%:判斷運算符前面的對象的各元素是否在后面對象的元素中喜颁,返回值的長度總與前面向量的長度相同。如:
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ù):不僅查詢滿足條件的值是多少曹阔,還可以查詢他們在原向量中的位置半开。
其用法為:
which(x, arr.ind = FALSE, useNames = TRUE)
x:邏輯向量,返回元素為TRUE的位置赃份。
如果僅需知道第1個為TRUE的位置寂拆,在后面加一個[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
關于向量的其他常見函數(shù)抓韩,請見troubleisafriend,
R語言常用數(shù)學函數(shù)
位置最大纠永、最小值所在的位置用函數(shù)which.max和which.min
- 向量的翻轉
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
- 向量的集合運算
交集:intersect(x, y);
并集:union(x, y)谒拴;
差集:setdiff(x, y)[1]尝江;
集合是否相等:setequal(x, y);
確定元素是否是集合的某個元素:is.element(x, y)彪薛,它等價于x %in% y
以上函數(shù)只能對兩個變量進行計算茂装。
使用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元素進行function操作善延,然后對操作完的值和第三個元素進行function操作少态,知道用盡x內的元素詳見
- 向量的算術運算
- 加:+
- 減:-
- 乘:*
- 除:/
- 取模(余數(shù)):%%
- 整除:%/%
- 乘方:^或**
2.2. 簡單列表
list可以為任意類型數(shù)據,一般函數(shù)的輸出結果均為list易遣。
任意幾個列表可以合成一個新列表彼妻。
- 列表的串聯(lián)和元素插入
如果我們需要讓兩個列表的元素組成新的列表,依然用函數(shù)c將多個列表連接起來豆茫,返回的是列表而不是向量侨歉。
也可以用append()函數(shù)。
append(x, values, after = length(x))(
append函數(shù)也可用于向量揩魂,也是取向量values中的元素幽邓。
如果原列表的元素有名字,則新列表的元素繼承其名字火脉,如果原列表元素沒有名字牵舵,在append函數(shù)中沒有添加名字的功能柒啤,可以在之后單獨用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
當在append函數(shù)中指定after值的時候畸颅,可用于元素的插入
2.3 矩陣
矩陣本質上是由維度的向量担巩。向量能夠進行的操作矩陣也可以進行。
矩陣創(chuàng)建
matrix(data = , nrow = 1, ncol = 1, byrow = FALSE, dimnames = NULL)
byrow=F為按列進行排列没炒,在這里我詳細說明涛癌。
矩陣的提取
[ ]內只有一個參數(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送火,
被拼接的對象可以是矩陣拳话,也可以是向量。他們在拼接方向需要有相同的維度漾脂。
#dim(x)可以查看維度
> dim(x)
[1] 2 4
當橫向拼接向量時假颇,向量被視為行向量胚鸯;當縱向拼接向量時骨稿,其被視為列向量。
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的矩陣
- 對角陣
diag(x = 1, nrow, ncol, names = TRUE)
- x可以是數(shù)字或矩陣或一維數(shù)組
- names=T:如果矩陣x 有名稱則繼承其名稱姜钳。
當僅包含兩個參數(shù)坦冠,第1個參數(shù)為單元素,第2個參數(shù)為整數(shù)n時哥桥,表示創(chuàng)建n維對角矩陣辙浑,每個對角元素都為第1個參數(shù)。
第1個元素的類型可以是整數(shù)型拟糕、實數(shù)型判呕、復數(shù)型或邏輯型,不能是字符串型送滞。對邏輯型來說侠草,非對角的地方為FALSE。
也可以創(chuàng)建對角線上元素不同的矩陣犁嗅,此時將對角線上的元素以向量的方式作為diag的第一個參數(shù)边涕,矩陣的維度與該向量的長度相同。如果指定維度褂微,若對角線上元素長度小于行數(shù)與列數(shù)中的最小值功蜓,指定對角線向量會復制多份首尾相連。
當x為矩陣時宠蚂,則不可以指定nrow和ncol式撼,直接輸出x對角線上的值。
> 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]
單行矩陣
矩陣轉置求厕、翻轉著隆、旋轉
轉置:
t(m1)
上下翻轉:
m1[nrow(m1):1, ]
左右翻轉:
m1[ ,ncol(m1):1]
順時針90度旋轉:
t(apply(m1, 2, rev))
逆時針90度旋轉:
t(apply(t(m1), 2, rev))
運算
2.4 高維數(shù)組
數(shù)組是具有維度(dim)屬性的向量叠洗。矩陣是一種特殊的數(shù)組(一維)。
array(x, c(3, 4, 2))二維的兩個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)
# 頁方向拼接
abind(x,y, along=3)
# 新的維度上拼接灭抑,新維度作為第1維,之前的維度順次后移
abind(x,y, along=0)
2.5 數(shù)據框
數(shù)據框是一種特殊的列表抵代,列表中每個元素都是一個有名字的向量腾节,且這些向量的長度相同。不同的向量可以是不同類型的荤牍。數(shù)據框是統(tǒng)計分析中最常用的數(shù)據結構案腺。
創(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中的字符串會被認為是因子類型康吵。用stringsAsFactor=F可以阻止變?yōu)樽址?/p>
所謂因子型劈榨,簡單來說是包含順序的字符串,順序可由用戶指定晦嵌。在建模時同辣,會被作為整數(shù)處理。
# 抑制字符串向因子型的轉換
df2 <- data.frame(name,age,gender,weight,stringsAsFactors=FALSE)
df2
行名惭载,列明的創(chuàng)建旱函、提取和修改。
向量名被默認作為數(shù)據框的列名描滔。
矩陣列名也會默認作為數(shù)據框列名棒妨。
如果數(shù)據框沒有指定列名,則列名默認為“V1”含长、“V2”…券腔,如果數(shù)據框沒有指定行名,則行名默認為“1”拘泞、“2”纷纫、“3”…。
獲取數(shù)據框列名田弥,可用names函數(shù)或colnames函數(shù)涛酗。
獲取數(shù)據框行名,可用row.names函數(shù)或rownames函數(shù)偷厦。
對數(shù)據框來說商叹,row.names函數(shù)效率更高,因而推薦使用row.names函數(shù)只泼。
在實際數(shù)據分析中剖笙,修改行名的做法很少見,更多的是增加一個ID列请唱,然后做相應的修改弥咪。
提取數(shù)據時如果需要保持為單列數(shù)據框过蹂,可以添加drop = FALSE參數(shù)
# 給一個尚不存在的列賦值,即增加該列
df$new <- 1:4
df[5] <- NULL # 刪除該列
# 可以通過序號的方式增加1列
df[5] <- c(T,F,F,T)
df
df <- data.frame(name,age,gender,weight) # 注意此處字符串會轉化為因子型
df5 <- rbind(df3,df4)
df7 <- cbind(df1,df6)
#將相同的列合并聚至,可以用merge函數(shù)
#merge函數(shù)會刪除重復的相同列酷勺,而且可以根據相同列的順序合并(相當于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
排序
如果需要根據一列或多列的順序,對其他列做相應的調整扳躬,可以使用order函數(shù)脆诉。如果需要將所有列都按降序排序,則增加decreasing = TRUE參數(shù)。如果大多數(shù)升序,某些降序僚纷,在降序的列前加-rank函數(shù)(如果是數(shù)值型,僅加負號就可以)明肮。如果大多數(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列前加一個-rank()就表示與默認排序方式不同亡呵。
df3 <- df[order(-rank(df$gender),df$weight),]
#gender升序抽活,weight降序(數(shù)值變量直接加-即可)
df4 <- df[order(df$gender,-df$weight),]
title: "R的學習筆記04"
author: "ks_c"
date: "2021/2/2"
output: html_document
<font face="宋體">以下為R數(shù)據分析指南與速查手冊 第三章的內容</font>
導出
導出變量
使用save(..., list = character(),file = stop("'file' must be specified"))可以保存單個變量或一些變量硫戈。文件名為.rda或.Rdata。
- ...:要存儲的變量
- list:變量標簽/名稱
- file:文件名及路徑
如果想保存整個環(huán)境下硕,用save.image函數(shù)丁逝。常用用法為save.image(file = ".RData"),用file指定文件名即可梭姓。
導出txt或csv
導出為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 = "")
導出文件中:
- 字符串型數(shù)據將用引號括起來霜幼,如果不想有引號,可設置quote = FALSE誉尖。
(注意導出的csv文件中也是如此罪既,只是如果用Excel打開的話,其中的引號不顯示出來铡恕,如果用文本查看器如Notepad++打開琢感,就可以看到引號。) - 如果要保存的數(shù)據不是數(shù)據框格式探熔,會被轉化為數(shù)據框格式驹针,然后再保存為csv或txt文件。
- 導出文件中默認包含行名(行序號)和列名诀艰,如果不需要柬甥,在write.table中可以設定row.names = FALSE及col.names = FALSE饮六,在write.csv中設定row.names=FALSE(在write.csv中,可以通過col.names給csv文件修改列名苛蒲,但是不能取消其列名)卤橄。
- 更多參數(shù)設置,可查看write.table的幫助文檔臂外。在write.csv中虽风,會將行名與列名交叉格以空字符串輸出,但write.table會將其空缺寄月。這會導致他們重新導入時辜膝,對行名的處理不同。
# 數(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)
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)#字符串沒有引號
導出圖片
直接保存而不展示圖片:
- 新建保存格式(稱之為一個圖形設備)漾肮,如png厂抖、jpg、pdf(pdf是矢量圖)克懊,
- 運行繪圖相關的代碼忱辅,
- 關閉圖形設備。
png("example_plot.png") # 新建一個圖片保存格式谭溉,png可以是jpg墙懂、pdf等
plot(1:10) # 繪圖
dev.off() # 關閉圖形設備
圖片的長、寬扮念、分辨率等參數(shù)可參考png等的幫助文檔损搬。
如果已經畫好了圖,可以使用如下代碼輸出到文件中柜与。
dev.copy(png, 'example_plot2.png')
dev.off()
如果最開始打開的是Windows窗口巧勤,則可用savePlot()函數(shù),其用法為:
savePlot(filename="Rplot",
type=c("wmf", "png", "jpeg", "jpg", "bmp", "ps"),
device=dev.cur())
#例子:
windows(width = 9, height = 9, rescale = "fit") # 打開一個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()
導出文本
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ù)據
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ù)據載入
數(shù)據
read.table默認的分隔符為空格弄匕,read.csv2默認的分隔符為分號;
可以改變默認的分隔符颅悉。
read.csv(file,
header = TRUE,
sep = ",",
quote = """,
dec = ".",
fill = TRUE,
comment.char = "", ...)
按行或單元導入(表格數(shù)據)
按行導入用readLines,按單元導入用scan
文本
整體讀取可用readr::read_file迁匠,
按行讀取可用readLines剩瓶,如
txt<- read_file("write_file.txt")
title: "R的學習筆記04"
author: "ks_c"
date: "2021/2/2"
output: html_document
<font face="宋體">以下為R數(shù)據分析指南與速查手冊 第四章的內容</font>
tidyverse包做探索性數(shù)據分析
- 數(shù)據變化
1 filter
2 select
3 arrange - 多表融合
- 增加新列
1 mutate
2 mutate與group_by
3 mutate_all
4 mutate_at
5 mutate_if - 數(shù)據匯總
1 summarise與group_by
2 summarise_all
3 summarise_at
4 summarise_if - 函數(shù)復用
- 可視化
1. 數(shù)據變換總結
- 行去重:distinct(.data, …, .keep_all = FALSE)
- 行篩選:filter()
- 列篩選:select()
- 行排序:arrange()
- 長轉寬:spread(data, key=鍵所在列, value=鍵值所在列)
- 寬轉長:gather(data, 需要轉換的各列, key = “新建的鍵名”, value = “新建的鍵值名”)
- 列合并:unite(data, col=新列, 需要合并的各列, sep = "_", remove = TRUE)
- 列分裂:separate(data, col, into=c(“列1”,“列2”,…), sep = “[^[:alnum:]]+”)
- 嵌套與取消嵌套:nest()、unnest()
1.1 filter
filter進行行篩選城丧,各逗號分隔的條件需同時滿足延曙,常用篩選條件有:
>, >=, <, <=, !=(不等于) , == ,near() , is.na(), %in%(前者是否在后者里面,返回值為T/F), between(x, left, right)
由于可能存在舍入誤差芙贫,浮點數(shù)最好不用 == 而用near搂鲫。
&, |, !, xor()(異或)
1.2 select
進行列篩選,各逗號分隔的條件任滿足其一即可磺平,常用輔助篩選函數(shù)有:
:(從a列到b列), - (除了這些列)
starts_with()魂仍、ends_with()拐辽、contains()、matches()擦酌、num_range()俱诸、one_of()、everything()赊舶、last_col()
1.3 arrange
對行進行排序睁搭,可以有多個排序條件,
降序:desc()
2. 多表融合總結
將兩個或多個表笼平,通過共同的列聯(lián)結起來园骆,常見的操作包括:
- 左聯(lián)結:left_join(x, y, by = NULL)
- 右聯(lián)結:right_join(x, y, by = NULL)
- 內聯(lián)結:inner_join(x, y, by = NULL)
- 全聯(lián)結:full_join(x, y, by = NULL)
- 半聯(lián)結:semi_join(x, y, by = NULL)
- 反聯(lián)結:anti_join(x, y, by = NULL)
- 多個表的聯(lián)結:list(x1, x2, x3,…) %>% reduce(····_join, by = NULL)
將具有相同列的兩個表或多個表,對行進行集合操作
- 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. 增加新列總結
對原有的列進行運算寓调,得到長度與數(shù)據行數(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ù)據匯總總結
分組對列進行統(tǒng)計匯總夺英,統(tǒng)計匯總函數(shù)一般含一個數(shù)據參數(shù)晌涕,這個參數(shù)為代表多個觀測的向量,返回單個數(shù)值痛悯。當返回多個值時余黎,可以將其轉換為list.
數(shù)據匯總(一般會與分組結合):
summarise()
summarise_all(.tbl, .funs, …)
summarise_if(.tbl, .predicate, .funs, …)
summarise_at(.tbl, .vars, .funs, …, .cols = NULL)
所有列采用相同匯總函數(shù)時也可用map()、map_*()载萌,但其無法和group_by結合
對summarise系列函數(shù)惧财,若返回長度大于1的向量,可用list將結果包圍炒考。
5. 函數(shù)復用總結
單變量
返回列表:map(.x, .f, …)
返回 * 類型的向量:map_(.x, .f, …)( 可以是lgl可缚、chr、int斋枢、dbl、raw)
得到輸出知给、打印瓤帚、保存等其他動作:walk()
返回數(shù)據框: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, …)等(沒有if和at)
p維變量:pmap(.l, .f, …)、pmap_(.x, .y, .f, …)等(沒有if和at)
遞歸復用:map_depth(.x, .depth, .f, …, .ragged = FALSE)
6. 可視化總結
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(點的大小表示頻次)、并排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
點或邊框的顏色:color (顏色字符串)
填充顏色:fill (顏色字符串)
形狀:shape(最多6種忠烛,代表形狀的數(shù)字)
點的大小百姓、線的粗細:size (毫米為單位的數(shù)字)
透明度:alpha
線型:linetype(整數(shù)或字符串: 0 = blank, 1 = solid, 2 = dashed, 3 = dotted, 4 = dotdash, 5 = longdash, 6 = twodash)
邊框粗細:stoke
group
STAT
“count”
“bin”
“identity”
“boxplot”
POSITION
“stack”:堆積
“identity”:獨立重疊
“dodge”:側面并列
“fill”:堆積歸一
“jitter”:擾動
“dodge2”
COORDINATE_FUNCTION
coord_flip:坐標翻轉
coord_fixed(ratio = 1/2):固定坐標比例
coord_polar:極坐標
coord_cartesian:笛卡爾坐標(默認,可修改坐標范圍)coord_cartesian(xlim = c(0, 5))
FACET_FUNCTION
單變量分面:facet_wrap
雙變量分面:facet_grid
第五章為R markdown的介紹况木,在