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


title: "R的學習筆記03"
author: "ks_c"
date: "2021/1/28"
output: html_document


????昨日在bookdown網站上看到一本書R數據分析指南與速查手冊,看起來挺不錯,奈何網絡奇差,每次打開bookdown網站時都花費不少時間,又無法直接下載,故在閱讀過程中做記錄于此。后時若用到,則不必費力再登陸彼網站。
郭曉,R 數據分析指南與速查手冊,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(更高級的代碼格式規范化工具,可參考formatR包)
  • 選擇與替換:Ctrl+F
  • 提取函數:Ctrl+Alt+X(RStudio 可以分析某一代碼段,并自動將其轉換成一個可- 重復使用的函數。任何在選擇的代碼內的“自由的”變量,即那些被引用但沒有被創建的變量,將被轉化為函數的參數)
  1. 命令窗口中:
  • 歷史中的上一條命令:向上箭頭
  • 歷史中的下一條命令:向下箭頭
  • 中斷運行的代碼:Esc
  • 清除命令窗口中的內容:Ctrl+L

2.常見運算符

運算符 含義
[ ] [[ ]] 索引(關于兩者之間差異請見這篇筆記 )
:: ::: 使用名稱訪問變量(一般使用::)
$ @ 元素提取、位置提取(更常用$)
^ 乘方
- + 負、正
: 創建數列(x<-c(1:10)#創建1到10的一個數列)
%任意% 特殊運算符
a%in%b#判斷a是否在b中,返回T or F
%>%管道符號,見這里
* / 乘、除
+ - 加、減
==、!=、<、>、<=、>= 比較運算符
! 邏輯非
&、&& 邏輯與
I (豎線,enter上遍的鍵那個) 邏輯或
~ 非,與!=等價
-> 、->> 向右賦值
= 賦值(右邊變量的值給左邊變量)
<- 、<<- 賦值(同上)
? 幫助

3. 關于換行

分號; 一行執行多條命令(誰會用呢)

 a <- 1;b <- 2
 a
[1] 1
 b
[1] 2

paste0( )函數:來凝結多行字符串

string1 <- "this is a long string 
+ with a ‘\n’  "
[1] "this is a long string \nwith \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()函數則不會出現

paste()和paste0()之間的區別在于:

paste(..., collapse ="" , recycle0 =F)

paste(..., sep="", collapse ="" , recycle0 =F)函數中多了一個sep參數,用來設置分隔符。

4. ifelse控制語句

類似Excel中的=if()函數。
在Excel中,=if(條件,值為T則,值為F則),在Rstudio中可以用ifelse()函數實現。

 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()函數

switch(EXPR, x1, x2, x3, ...., xn ):數值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. 循環語句: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的統計軟件而非newbeer的編程軟件。
利用向量化的操作比用循環對元素進行操作要更高效,且代碼更加簡潔。能用向量化的操作時應避免用循環操作。
以上代碼用向量化操作可以寫為:

b <- list("Appale",1,FALSE)
item.mode <- sapply(b,mode)#

sapply()函數:類似于lapply函數,但輸入為列表,返回值為向量

sapply(X, FUN, ..., )
X:列表、矩陣、數據框
FUN:自定義的調用函數
sapply(b, sum)# 求列表中各元素的和
sapply(b,mode)# 判斷各元素類型

6.2 while

當條件cond滿足時,重復執行表達式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()函數不同。
rep(x,times,length.out,each) 函數:將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{}則是重復執行花括號內的命令

x <- 1
repeat {
  print(x)
  x <- x + 1
  if (x == 6) {
    break
  }
}
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5

7. 定義函數

形式如下:

FuncName <- function (arglist) {
expr
return(value)
}
argilist:參數列表,用, 隔開。
expr:要執行的命令。
return():給出返回結果,如果不寫return語句,則將函數最后一個賦值語句作為返回值。如果不想返回任何對象,則可以將return的參數空缺,即寫為return()。
當使用參數時,如果沒有指定參數名,則按順序賦值,如果指定了參數名,可以不按順序賦值。對于已經指定了默認值的參數,可以在使用時不指定參數值。

類似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(包的名字)
  • 從環境中移除包:detach("package:包的名字", unload=TRUE)
  • 卸載包:remove.packages("包的名字")

<center><h1> 9. 常用函數</h1></center>

9.1. 常用數學函數

函數 描述
abs(x) 絕對值
sqrt(x) 開平方
ceiling(x) 向上取整
floor(x) 向下取整
trunc(x) 0-x的整數部分
round(x,digits=n) 舍入至n位小數
signif(x,digits=n) 該數字一共n個數(整數+小數)
cos(x) & sin(x) & tan(x) 三角函數
acos(x) & asin(x) & atan(x) 反三角函數
log(x,base=n) 取以n為底,x的對數
log10(x) 以10為底,x的對數
exp(x) 指數函數:以e為底的指數

9.2. 統計函數

函數 描述
mean(x) 均值
media(x) 中位數
sd(x) / var(x) 標準差/方差
mad(x) 絕對中位差
quantile(x, probs) 分位數
range(x) 全域
sum(x) 求和
diff(x, lag=n) 滯后n位的滯后差分…[1]
min(x)/max(x) 極值
scale(x, center=T, scale=T) 中心化/標準化處理[2]
cov(x) 協方差

[1] : 滯后差分:

x<-c(1,5,23,29)
diff(x)
[ 1 ] 4,8,6

[2] : scale(x):標準化;scale(x,scale=F):中心化。

9.3概率函數

概率函數分為4類:密度函數、分布函數、分位數函數、生成隨機數。
根據不同的分布,又分為正態分布、均勻分布等等,二者組合成為具體的函數,在R中,前面4種類型用下面字母打頭,之后的函數如下表所示:

d = 密度函數( density,y軸的值)
p = 分布函數( distribution function)
q = 分位數函數( quantile function)
r = 生成隨機數(隨機偏差Random error)

縮寫 分布名稱
norm 正態分布
t t分布
chisq 卡方分布
f F分布
unif 均勻分布
logis 邏輯分布
singrank wilcoxon符號秩和分布
wilcox wilcoxon秩和分布
beta Beta分布
binom 二項分布
exp 指數分布
geom 幾何分布
pois 泊松分布

對數

其余詳見下圖


分布名稱與縮寫

概率為0.95的N~(0,1)的分位數為1.64

qnorm(p=0.95,mean=0,sd=1)
[1] 1.644854

概率為0.99的N~(0,1)的分位數為1.64

qnorm(p=0.99, mean=0, sd=1)
[1] 2.326348

分位數為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個數據,并不是run if。

9.4. 工作空間函數

在R中,所有反斜杠\代表轉義,工作路徑用兩個反斜杠或者正斜杠。


工作空間管理

ls(all.names=TRUE): 得到包含隱藏變量(以點開頭的變量)的列表。

.Last.value:得到上次運行的結果

search(): 查看已經載入的包。

library():查看已經安裝的包。

data(dsname,package="pkgname"):不載入某個包的情況下,使用該包的某個數據

9.5. 幫助函數

獲取函數的幫助:?后接函數名,函數可不加括號,顯示函數的幫助文檔。

獲取的幫助:用命令help(package="包的名字")。

獲取函數源代碼:命令窗口中輸入函數,不加括號并回車后
? 有時候這個函數可能是一個類函數(Generic Function),如plot函數,則先使用methods() 函數來查看這個類函數的列表,找到具體需要的函數如plot.default,使用?plot.default進行查看。

獲取特殊符號的幫助,如[[,if,用help("特殊符號")

其他幫助命令見下圖:


幫助命令




title: "R的學習筆記04"
author: "ks_c"
date: "2021/1/29"
output: html_document


<font face="宋體">以下為R數據分析指南與速查手冊 第二章的內容</font>

2.1 向量

注意事項

  • 向量內部的數據是同一類型

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

&、|、!為向量中各元素分別求“與”、“或”、“非”,而&&、| |為向量第一個元素求“與”、“或”。 如果要求向量內部所有元素求“與”,用函數all,如果要求向量內部所有元素求“或”,用函數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函數:不僅查詢滿足條件的值是多少,還可以查詢他們在原向量中的位置。
其用法為:

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()函數從小到大排序
y1
[1] 1.000000 2.000000 3.000000 3.141593 4.000000
[6] 5.000000 6.000000

y2 <- x[order(x,decreasing = TRUE)] # 用order()函數從大到小排
y2
[1] 6.000000 5.000000 4.000000 3.141593 3.000000 2.000000 1.000000

y12 <- sort(x) # 用sort函數
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

關于向量的其他常見函數,請見troubleisafriend,
R語言常用數學函數

位置最大、最小值所在的位置用函數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
以上函數只能對兩個變量進行計算。
使用Reduce(function, x, init, right = FALSE, accumulate = FALSE)函數[2]可以批量操作:

Reduce(intersect, list(a,b,d))

[1] : 除去a中b的部分(A-B)
[2] : 將x中第1、2元素進行function操作,然后對操作完的值和第三個元素進行function操作,知道用盡x內的元素詳見

  • 向量的算術運算
  • 加:+
  • 減:-
  • 乘:*
  • 除:/
  • 取模(余數):%%
  • 整除:%/%
  • 乘方:^或**

2.2. 簡單列表

list可以為任意類型數據,一般函數的輸出結果均為list。

任意幾個列表可以合成一個新列表。

  • 列表的串聯和元素插入

如果我們需要讓兩個列表的元素組成新的列表,依然用函數c將多個列表連接起來,返回的是列表而不是向量。
也可以用append()函數。

append(x, values, after = length(x))(
append函數也可用于向量,也是取向量values中的元素。
如果原列表的元素有名字,則新列表的元素繼承其名字,如果原列表元素沒有名字,在append函數中沒有添加名字的功能,可以在之后單獨用names()函數添加名字。

> 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函數中指定after值的時候,可用于元素的插入

2.3 矩陣

矩陣本質上是由維度的向量。向量能夠進行的操作矩陣也可以進行。

矩陣創建

matrix(data = , nrow = 1, ncol = 1, byrow = FALSE, dimnames = NULL)
byrow=F為按列進行排列,在這里我詳細說明。

矩陣的提取

[ ]內只有一個參數時按列提取

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

特殊矩陣的創建

  1. 全0矩陣(初始化)

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

  1. 對角陣

diag(x = 1, nrow, ncol, names = TRUE)

  • x可以是數字或矩陣或一維數組
  • names=T:如果矩陣x 有名稱則繼承其名稱。

當僅包含兩個參數,第1個參數為單元素,第2個參數為整數n時,表示創建n維對角矩陣,每個對角元素都為第1個參數。
第1個元素的類型可以是整數型、實數型、復數型或邏輯型,不能是字符串型。對邏輯型來說,非對角的地方為FALSE。

也可以創建對角線上元素不同的矩陣,此時將對角線上的元素以向量的方式作為diag的第一個參數,矩陣的維度與該向量的長度相同。如果指定維度,若對角線上元素長度小于行數與列數中的最小值,指定對角線向量會復制多份首尾相連。

當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 高維數組

數組是具有維度(dim)屬性的向量。矩陣是一種特殊的數組(一維)。
array(x, c(3, 4, 2))二維的兩個3 x 4的矩陣組成的數組

>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

數組拼接

abind包中的abind()函數: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 數據框

數據框是一種特殊的列表,列表中每個元素都是一個有名字的向量,且這些向量的長度相同。不同的向量可以是不同類型的。數據框是統計分析中最常用的數據結構。

創建

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可以阻止變為字符串。

所謂因子型,簡單來說是包含順序的字符串,順序可由用戶指定。在建模時,會被作為整數處理。

# 抑制字符串向因子型的轉換
df2 <- data.frame(name,age,gender,weight,stringsAsFactors=FALSE)
df2

行名,列明的創建、提取和修改。

向量名被默認作為數據框的列名。
矩陣列名也會默認作為數據框列名。
如果數據框沒有指定列名,則列名默認為“V1”、“V2”…,如果數據框沒有指定行名,則行名默認為“1”、“2”、“3”…。
獲取數據框列名,可用names函數或colnames函數。
獲取數據框行名,可用row.names函數或rownames函數。
對數據框來說,row.names函數效率更高,因而推薦使用row.names函數。

在實際數據分析中,修改行名的做法很少見,更多的是增加一個ID列,然后做相應的修改。

提取數據時如果需要保持為單列數據框,可以添加drop = FALSE參數

# 給一個尚不存在的列賦值,即增加該列
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函數
#merge函數會刪除重復的相同列,而且可以根據相同列的順序合并(相當于Excel中的=vlookup)

條件查詢

subset(x, subset, select, drop=F)
subset參數可以提取行方面滿足條件
select參數可以為列方面選取的范圍

df2 <- subset(df,subset = name!="Einstein"&age>10,select = c(age:weight,height))
# !=為不等于
df2

排序

如果需要根據一列或多列的順序,對其他列做相應的調整,可以使用order函數。如果需要將所有列都按降序排序,則增加decreasing = TRUE參數。如果大多數升序,某些降序,在降序的列前加-rank函數(如果是數值型,僅加負號就可以)。如果大多數降序,某些升序,在升序前加-rank函數函數,且添加decreasing = TRUE參數。下面是一些列子:

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降序(數值變量直接加-即可)
df4 <- df[order(df$gender,-df$weight),]


title: "R的學習筆記04"
author: "ks_c"
date: "2021/2/2"
output: html_document


<font face="宋體">以下為R數據分析指南與速查手冊 第三章的內容</font>

導出

導出變量

使用save(..., list = character(),file = stop("'file' must be specified"))可以保存單個變量或一些變量。文件名為.rda或.Rdata。

  • ...:要存儲的變量
  • list:變量標簽/名稱
  • file:文件名及路徑

如果想保存整個環境,用save.image函數。常用用法為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 = "")

導出文件中:

  • 字符串型數據將用引號括起來,如果不想有引號,可設置quote = FALSE。
    (注意導出的csv文件中也是如此,只是如果用Excel打開的話,其中的引號不顯示出來,如果用文本查看器如Notepad++打開,就可以看到引號。)
  • 如果要保存的數據不是數據框格式,會被轉化為數據框格式,然后再保存為csv或txt文件。
  • 導出文件中默認包含行名(行序號)和列名,如果不需要,在write.table中可以設定row.names = FALSE及col.names = FALSE,在write.csv中設定row.names=FALSE(在write.csv中,可以通過col.names給csv文件修改列名,但是不能取消其列名)。
  • 更多參數設置,可查看write.table的幫助文檔。在write.csv中,會將行名與列名交叉格以空字符串輸出,但write.table會將其空缺。這會導致他們重新導入時,對行名的處理不同。
# 數據生成
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() # 關閉圖形設備

圖片的長、寬、分辨率等參數可參考png等的幫助文檔。

如果已經畫好了圖,可以使用如下代碼輸出到文件中。

dev.copy(png, 'example_plot2.png')
dev.off()

如果最開始打開的是Windows窗口,則可用savePlot()函數,其用法為:

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通用的數據

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)

數據載入

數據

read.table默認的分隔符為空格,read.csv2默認的分隔符為分號;
可以改變默認的分隔符。

read.csv(file,
header = TRUE,
sep = ",",
quote = """,
dec = ".",
fill = TRUE,
comment.char = "", ...)

按行或單元導入(表格數據)
按行導入用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數據分析指南與速查手冊 第四章的內容</font>


tidyverse包做探索性數據分析

  • 數據變化
    1 filter
    2 select
    3 arrange
  • 多表融合
  • 增加新列
    1 mutate
    2 mutate與group_by
    3 mutate_all
    4 mutate_at
    5 mutate_if
  • 數據匯總
    1 summarise與group_by
    2 summarise_all
    3 summarise_at
    4 summarise_if
  • 函數復用
  • 可視化

1. 數據變換總結

  • 行去重: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)

由于可能存在舍入誤差,浮點數最好不用 == 而用near。

&, |, !, xor()(異或)

1.2 select

進行列篩選,各逗號分隔的條件任滿足其一即可,常用輔助篩選函數有:

:(從a列到b列), - (除了這些列)
starts_with()、ends_with()、contains()、matches()、num_range()、one_of()、everything()、last_col()

1.3 arrange

對行進行排序,可以有多個排序條件,
降序:desc()

2. 多表融合總結

將兩個或多個表,通過共同的列聯結起來,常見的操作包括:

  • 左聯結:left_join(x, y, by = NULL)
  • 右聯結:right_join(x, y, by = NULL)
  • 內聯結:inner_join(x, y, by = NULL)
  • 全聯結:full_join(x, y, by = NULL)
  • 半聯結:semi_join(x, y, by = NULL)
  • 反聯結:anti_join(x, y, by = NULL)
  • 多個表的聯結: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. 增加新列總結

對原有的列進行運算,得到長度與數據行數相同的新列。

分組與取消分組: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. 數據匯總總結

分組對列進行統計匯總,統計匯總函數一般含一個數據參數,這個參數為代表多個觀測的向量,返回單個數值。當返回多個值時,可以將其轉換為list.

數據匯總(一般會與分組結合):
summarise()
summarise_all(.tbl, .funs, …)
summarise_if(.tbl, .predicate, .funs, …)
summarise_at(.tbl, .vars, .funs, …, .cols = NULL)
所有列采用相同匯總函數時也可用map()、map_*(),但其無法和group_by結合
對summarise系列函數,若返回長度大于1的向量,可用list將結果包圍。

5. 函數復用總結

單變量
返回列表:map(.x, .f, …)
返回 * 類型的向量:map_(.x, .f, …)( 可以是lgl、chr、int、dbl、raw)
得到輸出、打印、保存等其他動作:walk()
返回數據框: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
連續變量頻次:geom_histogram、geom_freqpoly、 geom_density
離散vs連續:geom_boxplot、geom_violin、并排geom_histogram
離散vs離散:geom_tile(熱力圖,顏色深淺表示頻次),geom_count(點的大小表示頻次)、并排geom_bar
連續vs連續: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種,代表形狀的數字)
點的大小、線的粗細:size (毫米為單位的數字)
透明度:alpha
線型:linetype(整數或字符串: 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的介紹,在

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,362評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,577評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,486評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,852評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,600評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,944評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,944評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,108評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,652評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,385評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,616評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,111評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,798評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,205評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,537評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,334評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,570評論 2 379

推薦閱讀更多精彩內容