#R的學習筆記02(《R數(shù)據分析指南與速查手冊》)


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. 快捷鍵

  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ù))
  1. 命令窗口中:
  • 歷史中的上一條命令:向上箭頭
  • 歷史中的下一條命令:向下箭頭
  • 中斷運行的代碼: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)建

  1. 全0矩陣(初始化)

matrix(data = 0, nrow = 2, ncol = 2)即可得到2 x 2的全部為0的矩陣

  1. 對角陣

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))

運算

矩陣級運算1
矩陣級運算2

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的介紹况木,在

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末垒拢,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子火惊,更是在濱河造成了極大的恐慌求类,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,013評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件屹耐,死亡現(xiàn)場離奇詭異尸疆,居然都是意外死亡,警方通過查閱死者的電腦和手機惶岭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,205評論 2 382
  • 文/潘曉璐 我一進店門寿弱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人按灶,你說我怎么就攤上這事症革。” “怎么了鸯旁?”我有些...
    開封第一講書人閱讀 152,370評論 0 342
  • 文/不壞的土叔 我叫張陵噪矛,是天一觀的道長。 經常有香客問我铺罢,道長艇挨,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,168評論 1 278
  • 正文 為了忘掉前任韭赘,我火速辦了婚禮缩滨,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己脉漏,他們只是感情好苞冯,可當我...
    茶點故事閱讀 64,153評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著鸠删,像睡著了一般抱完。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上刃泡,一...
    開封第一講書人閱讀 48,954評論 1 283
  • 那天巧娱,我揣著相機與錄音,去河邊找鬼烘贴。 笑死禁添,一個胖子當著我的面吹牛,可吹牛的內容都是我干的桨踪。 我是一名探鬼主播老翘,決...
    沈念sama閱讀 38,271評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼锻离!你這毒婦竟也來了铺峭?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 36,916評論 0 259
  • 序言:老撾萬榮一對情侶失蹤汽纠,失蹤者是張志新(化名)和其女友劉穎卫键,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體虱朵,經...
    沈念sama閱讀 43,382評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡莉炉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,877評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了碴犬。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片絮宁。...
    茶點故事閱讀 37,989評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖服协,靈堂內的尸體忽然破棺而出绍昂,到底是詐尸還是另有隱情,我是刑警寧澤蚯涮,帶...
    沈念sama閱讀 33,624評論 4 322
  • 正文 年R本政府宣布治专,位于F島的核電站,受9級特大地震影響遭顶,放射性物質發(fā)生泄漏。R本人自食惡果不足惜泪蔫,卻給世界環(huán)境...
    茶點故事閱讀 39,209評論 3 307
  • 文/蒙蒙 一棒旗、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦铣揉、人聲如沸饶深。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,199評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽敌厘。三九已至,卻和暖如春朽合,著一層夾襖步出監(jiān)牢的瞬間俱两,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,418評論 1 260
  • 我被黑心中介騙來泰國打工曹步, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留宪彩,地道東北人。 一個月前我還...
    沈念sama閱讀 45,401評論 2 352
  • 正文 我出身青樓讲婚,卻偏偏與公主長得像尿孔,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子筹麸,可洞房花燭夜當晚...
    茶點故事閱讀 42,700評論 2 345

推薦閱讀更多精彩內容