本文主要是為了從零開始學習和理解R語言,簡要介紹了該語言的最重要部分,以快速入門。主要參考文章:
?R-Tutorial??
R語言程序的編寫需要安裝R或RStudio,通常是在RStudio中鍵入代碼。但是RStudio個人感覺并不好用,因此本人編寫的R語言程序都是在Jupyter Notebook平臺使用。具體可以見在 Jupyter Notebook 中使用R語言。R語言和Python,matlab一樣都是解釋型語言,語法差別不大,容易入門。其他進階內容見R語言個人筆記
文章目錄
- 2.1 向量基礎
- 2.2 操縱向量
- 2.3 數據框dataframe
- 3.1 paste函數
- 3.2 處理日期
- 3.3 制作列連表
- 3.4 列表
- 3.5 If-Else語句
- 3.6 for循環
- 3.7 apply類別函數
- 3.8 使用tryCatch()處理錯誤
1 入門基礎
1.1 基礎使用
運算符
R語言程序都可以當成計算器使用,#在R語言中是注釋符,R忽略#之后的一切。
2 + 3 # 加法 52 * 3 # 乘法 6sqrt(36) # 開根號 6log10(100) # 10為底的對數運算 210 / 3 # 除法 3.3333333333333310 %/% 3 # 整除 310 %% 3 # 求余 15
6
6
2
3.33333333333333
3
1
賦值運算符
與大多數其他語言不同,R除了使用通常的=運算符賦值外,還使用<-或者->運算符。在R語言中<-或者->運算符就相當于=號,唯一的區別是<-和->指明了運算方向。==表示是否相等,=表示賦值。
a <- 10 # 把10賦值給aa = 10 # 把10賦值給a10 -> a # 把10賦值給a# 10 = a # 出錯數據類型
R語言沒有專門的步驟來定義變量的類型。R會在后臺直觀地進行判斷變量的類型。我們可以通過class函數來查看變量的數據類型
class(a) # numeric類型class(1.1) # numeric類型‘numeric’
‘numeric’
根據分配給變量a的值,R決定將a分配為numeric類型。如果您選擇將其更改為字符’10’而不是數字10,則可以執行以下操作:
a <- as.character(a) # 轉換a為字符串print(a) # 打印a "10"class(a) # 數據類型 "character"[1] "10"‘character’
當然我們也可以將a從字符串變為數字
a <- as.numeric(a)print(a) # 打印a 10class(a) # 數據類型 "numeric"[1] 10‘numeric’
常用的R語言類如下
變量
- character 字符串
- integer 整數
- numeric 整數+分數
- factor 分類變量,其中每個級別都是一個類別
- logical 布爾
- complex 復數
數據類別
- vector 同類元素的集合
- matrix 矩陣
- data.frame 類似excel中的二維表
- list 列表
我們可以通過as.類型名來改變變量類型
a<-as.matrix(a)print(a)class(a)[,1][1,] 10‘matrix’
a<-as.logical(a)print(a)class(a)[1] TRUE‘logical’
1.2 軟件包的安裝
首次安裝時,R附帶有一組內置軟件包,可以直接從R控制臺調用它們。但是,由于R是一種開放源代碼語言,因此任何人都可以通過編寫軟件包來為其功能做出貢獻。多年來,這些貢獻已導致超過5K軟件包的清單不斷增加。這是從R控制臺中安裝軟件包的方法。注意不要在jupyter notebook中使用該代碼,因為要選擇cran鏡像,很容易崩潰的。
#install.packages("car") # install car package現在已經安裝了該軟件包,您需要對其進行初始化,然后才能調用已安裝的軟件包隨附的函數和數據集。
library(car) # 初始化包require(car) # 另一種初始化方法#library() # 查看已經安裝好的包#library(help=car) # 查看car包的幫助信息Warning message:"package 'car' was built under R version 3.6.1"Loading required package: carDataWarning message:"package 'carData' was built under R version 3.6.1"對于R語言可以直接輸入代碼查詢包和函數的介紹信息
#help(merge) # 查看merge的幫助信息#?merge # 從安裝包中查找merge信息,和help類似#??merge # 模糊搜索example(merge) # 展示示例代碼merge> authors <- data.frame(merge+ ## I(*) : use character columns of names to get sensible sort ordermerge+ surname = I(c("Tukey", "Venables", "Tierney", "Ripley", "McNeil")),merge+ nationality = c("US", "Australia", "US", "UK", "Australia"),merge+ deceased = c("yes", rep("no", 4)))merge> authorN <- within(authors, { name <- surname; rm(surname) })merge> books <- data.frame(merge+ name = I(c("Tukey", "Venables", "Tierney",merge+ "Ripley", "Ripley", "McNeil", "R Core")),merge+ title = c("Exploratory Data Analysis",merge+ "Modern Applied Statistics ...",merge+ "LISP-STAT",merge+ "Spatial Statistics", "Stochastic Simulation",merge+ "Interactive Data Analysis",merge+ "An Introduction to R"),merge+ other.author = c(NA, "Ripley", NA, NA, NA, NA,merge+ "Venables & Smith"))merge> (m0 <- merge(authorN, books)) name nationality deceased title other.author1 McNeil Australia no Interactive Data Analysis <NA>2 Ripley UK no Spatial Statistics <NA>3 Ripley UK no Stochastic Simulation <NA>4 Tierney US no LISP-STAT <NA>5 Tukey US yes Exploratory Data Analysis <NA>6 Venables Australia no Modern Applied Statistics ... Ripleymerge> (m1 <- merge(authors, books, by.x = "surname", by.y = "name")) surname nationality deceased title other.author1 McNeil Australia no Interactive Data Analysis <NA>2 Ripley UK no Spatial Statistics <NA>3 Ripley UK no Stochastic Simulation <NA>4 Tierney US no LISP-STAT <NA>5 Tukey US yes Exploratory Data Analysis <NA>6 Venables Australia no Modern Applied Statistics ... Ripleymerge> m2 <- merge(books, authors, by.x = "name", by.y = "surname")merge> stopifnot(exprs = {merge+ identical(m0, m2[, names(m0)])merge+ as.character(m1[, 1]) == as.character(m2[, 1])merge+ all.equal(m1[, -1], m2[, -1][ names(m1)[-1] ])merge+ identical(dim(merge(m1, m2, by = NULL)),merge+ c(nrow(m1)*nrow(m2), ncol(m1)+ncol(m2)))merge+ })merge> ## "R core" is missing from authors and appears only here :merge> merge(authors, books, by.x = "surname", by.y = "name", all = TRUE) surname nationality deceased title other.author1 McNeil Australia no Interactive Data Analysis <NA>2 R Core <NA> <NA> An Introduction to R Venables & Smith3 Ripley UK no Spatial Statistics <NA>4 Ripley UK no Stochastic Simulation <NA>5 Tierney US no LISP-STAT <NA>6 Tukey US yes Exploratory Data Analysis <NA>7 Venables Australia no Modern Applied Statistics ... Ripleymerge> ## example of using 'incomparables'merge> x <- data.frame(k1 = c(NA,NA,3,4,5), k2 = c(1,NA,NA,4,5), data = 1:5)merge> y <- data.frame(k1 = c(NA,2,NA,4,5), k2 = c(NA,NA,3,4,5), data = 1:5)merge> merge(x, y, by = c("k1","k2")) # NA's match k1 k2 data.x data.y1 4 4 4 42 5 5 5 53 NA NA 2 1merge> merge(x, y, by = "k1") # NA's match, so 6 rows k1 k2.x data.x k2.y data.y1 4 4 4 4 42 5 5 5 5 53 NA 1 1 NA 14 NA 1 1 3 35 NA NA 2 NA 16 NA NA 2 3 3merge> merge(x, y, by = "k2", incomparables = NA) # 2 rows k2 k1.x data.x k1.y data.y1 4 4 4 4 42 5 5 5 5 5設置工作目錄
工作目錄是R可以直接訪問以讀取文件的參考目錄。您可以在不使用完整文件路徑的情況下直接將文件讀取和寫入文件到工作目錄。目錄名稱應使用正斜杠/或反斜杠分隔\,對于Windows也應如此。
# getwd() # 獲得當前工作目錄# setwd(dirname) # 設置工作目錄如何導入和導出數據
將數據引入R的最常見,最方便的方法是通過.csv文件。有一些軟件包可以從excel文件(.xlsx)和數據庫中導入數據,但此處不介紹。
a <- 1:3b <- (1:3)/5c <- c("row1", "row2", "row3")# 建立dataframedata <- data.frame(a, b, c)dataA data.frame: 3 × 3
a
| b
| c
| <int>
| <dbl>
| <fct>
| 1
| 0.2
| row1
| 2
| 0.4
| row2
| 3
| 0.6
| row3
|
# 將data保存為csv文件write.csv(data, file="d:/data.csv", row.names = FALSE)# 將data保存為txt文件,sep表示用sep分割列write.table(data, file ="d:/data.txt", sep =",", row.names =FALSE)# 讀取csv文件data <- read.csv("d:/data.csv", header=FALSE)dataA data.frame: 4 × 3
V1
| V2
| V3
| <fct>
| <fct>
| <fct>
| a
| b
| c
| 1
| 0.2
| row1
| 2
| 0.4
| row2
| 3
| 0.6
| row3
|
# 讀取txt文件data <- read.table(file ="d:/data.txt", header = TRUE, sep=",", colClasses=c("integer","numeric","character"))dataA data.frame: 3 × 3
a
| b
| c
| <int>
| <dbl>
| <chr>
| 1
| 0.2
| row1
| 2
| 0.4
| row2
| 3
| 0.6
| row3
|
R將直觀地找出應該為dataframe中的列分配哪種數據類型。如果要手動分配,則可以通過在read.csv或read.table中使用colClasses參數進行設置,實際上,建議這樣做,因為它可以提高導入過程的效率。
2 復雜變量
2.1 向量基礎
如何創建一個向量
可以使用Combine函數即c()創建向量。該向量中可以包含的所有類型元素。此外,向量只能保存一種類型的數據,例如字符,數字,邏輯。如果嘗試在向量內創建數據類型的混合,例如字符和數字,所有數字都會自動轉換為字符。因為數字都可以轉換為字符,但是字符不都能轉換為數字,如’a’。
vec1 <- c(10, 20, 15, 40) # 數字向量vec1vec2 <- c("a", "b", "c", NA) # 字符向量vec2vec3 <- c(TRUE, FALSE, TRUE, TRUE) # 邏輯向量vec3vec4 <- gl(4, 1, 4, label = c("l1", "l2", "l3", "l4")) # 因子向量vec4vec5 <- c(4111, "2", 4) # 混合變量vec5
- 10
- 20
- 15
- 40
- 'a'
- 'b'
- 'c'
- NA
- TRUE
- FALSE
- TRUE
- TRUE
- l1
- l2
- l3
- l4
Levels:
- 'l1'
- 'l2'
- 'l3'
- 'l4'
- '4111'
- '2'
- '4'
如何引用向量的元素?
向量的元素可以使用其索引進行訪問。向量的第一個元素的索引為1,最后一個元素的索引值為length(vectorName)。這一點和其他語言不一樣,R語言索引從1開始。索引變量名[i,j]表示索引從i到j的值。
vec1length(vec1) # 4print(vec1[1]) # 10print(vec1[1:3]) # 10, 20, 154
[1] 10[1] 10 20 15此外有時候我們需要初始化一個定長的向量,做法如下。
# 生長大度為10的向量,用0填充numericVector <- numeric(10)numericVector2.2 操縱向量
子集
vec1logic1 <- vec1 < 16 # 創建一個邏輯向量,小于16為true,反之falselogic1
- 10
- 20
- 15
- 40
- TRUE
- FALSE
- TRUE
- FALSE
vec1[logic1] # 讀取位置為true的元素vec1[1:2] # 讀取第一個和第二個元素vec1[c(1,3)] # 讀取第一個和第三個元素vec1[-1] # 返回所有元素,除了第一個。-1表示排除第一個元素,和其他語言不一樣。
- 10
- 15
- 10
- 20
- 10
- 15
- 20
- 15
- 40
排序
sort(vec1) # 從小到大排序sort(vec1, decreasing = TRUE) # 從大到小排序排序也可以使用order()函數實現,該函數以升序返回元素的索引。
vec1[order(vec1)] # 從小到大vec1[rev(order(vec1))] # 從大到小創建向量序列和重復值
seq()和rep()函數用于創建自定義向量序列。rep()函數也可用于生成重復字符。
seq(1, 10, by = 2) # 創建1到10的向量序列,步長為2seq(1, 10, length=5) # 創建1到10的向量序列,等間隔獲得5個值rep(1, 5) # 重復1,次數5次rep(1:3, 2) # 重復1到3,次數兩次rep(1:3, each=2) # 重復1到3,每個數字重復兩次
- 1
- 3
- 5
- 7
- 9
- 1
- 3.25
- 5.5
- 7.75
- 10
- 1
- 1
- 1
- 1
- 1
- 1
- 2
- 3
- 1
- 2
- 3
- 1
- 1
- 2
- 2
- 3
- 3
如何刪除缺失值
可以使用is.na()函數來處理缺失值,該函數會在缺失值(NA)的位置返回邏輯值為TRUE的邏輯向量
vec2 <- c("a", "b", "c", NA) # character vectoris.na(vec2) # missing TRUE!is.na(vec2) # missing FALSEvec2[!is.na(vec2)] # 返回非NA的元素
- FALSE
- FALSE
- FALSE
- TRUE
- TRUE
- TRUE
- TRUE
- FALSE
- 'a'
- 'b'
- 'c'
采樣
set.seed(42) # 設置隨機數種子,以vec1sample(vec1) # 隨機從vec1中抽取所有數sample(vec1, 3) # 隨機不放回從vec1中抽取3個數sample(vec1, 5, replace=T) # 隨機放回從vec1中抽取5個數
- 10
- 20
- 15
- 40
- 10
- 40
- 15
- 20
- 20
- 40
- 15
- 10
- 40
- 15
- 40
- 15
2.3 數據框dataframe
創建數據框并訪問行和列
數據框是執行各種分析的方便且流行的數據對象。諸如read.csv()之類的導入語句會將數據作為數據幀導入R中,因此保持這種方式很方便。現在,使用我們之前創建的向量創建一個數據框。
vec1vec2vec3vec4
- 10
- 20
- 15
- 40
- 'a'
- 'b'
- 'c'
- NA
- TRUE
- FALSE
- TRUE
- TRUE
- l1
- l2
- l3
- l4
Levels:
# 每一個向量組成一列myDf1 <- data.frame(vec1, vec2) myDf1myDf2 <- data.frame(vec1, vec3, vec4)myDf2myDf3 <- data.frame(vec1, vec2, vec3)myDf3A data.frame: 4 × 2
vec1
| vec2
| <dbl>
| <fct>
| 10
| a
| 20
| b
| 15
| c
| 40
| NA
|
A data.frame: 4 × 3
vec1
| vec3
| vec4
| <dbl>
| <lgl>
| <fct>
| 10
| TRUE
| l1
| 20
| FALSE
| l2
| 15
| TRUE
| l3
| 40
| TRUE
| l4
|
A data.frame: 4 × 3
vec1
| vec2
| vec3
| <dbl>
| <fct>
| <lgl>
| 10
| a
| TRUE
| 20
| b
| FALSE
| 15
| c
| TRUE
| 40
| NA
| TRUE
|
內置數據集和基本操作
R帶有一組內置數據。為了進一步說明,我們將使用airquality數據集
library(datasets) # 初始化#library(help=datasets) # 展示數據集信息# 展示數據集頭部六行head(airquality)A data.frame: 6 × 6
Ozone
| Solar.R
| Wind
| Temp
| Month
| Day
| <int>
| <int>
| <dbl>
| <int>
| <int>
| <int>
| 41
| 190
| 7.4
| 67
| 5
| 1
| 36
| 118
| 8.0
| 72
| 5
| 2
| 12
| 149
| 12.6
| 74
| 5
| 3
| 18
| 313
| 11.5
| 62
| 5
| 4
| NA
| NA
| 14.3
| 56
| 5
| 5
| 28
| NA
| 14.9
| 66
| 5
| 6
|
接來介紹數據集data.frame基礎操作
class(airquality) # dataframe類型sapply(airquality, class) # 獲得dataframe每一列的類型str(airquality) # dataframe的結構‘data.frame’
'integer' Solar.R 'integer' Wind 'numeric' Temp 'integer' Month 'integer' Day 'integer'
'data.frame': 153 obs. of 6 variables: $ Ozone : int 41 36 12 18 NA 28 23 19 8 NA ... $ Solar.R: int 190 118 149 313 NA NA 299 99 19 194 ... $ Wind : num 7.4 8 12.6 11.5 14.3 14.9 8.6 13.8 20.1 8.6 ... $ Temp : int 67 72 74 62 56 66 65 59 61 69 ... $ Month : int 5 5 5 5 5 5 5 5 5 5 ... $ Day : int 1 2 3 4 5 6 7 8 9 10 ...summary(airquality) # 數據集各列總結#fix(airquality) # 類似excel的方式展示數據集Ozone Solar.R Wind Temp Min. : 1.00 Min. : 7.0 Min. : 1.700 Min. :56.00 1st Qu.: 18.00 1st Qu.:115.8 1st Qu.: 7.400 1st Qu.:72.00 Median : 31.50 Median :205.0 Median : 9.700 Median :79.00 Mean : 42.13 Mean :185.9 Mean : 9.958 Mean :77.88 3rd Qu.: 63.25 3rd Qu.:258.8 3rd Qu.:11.500 3rd Qu.:85.00 Max. :168.00 Max. :334.0 Max. :20.700 Max. :97.00 NA's :37 NA's :7 Month Day Min. :5.000 Min. : 1.0 1st Qu.:6.000 1st Qu.: 8.0 Median :7.000 Median :16.0 Mean :6.993 Mean :15.8 3rd Qu.:8.000 3rd Qu.:23.0 Max. :9.000 Max. :31.0rownames(airquality) # dataframe行名colnames(airquality) # dataframe列名nrow(airquality) # 行數ncol(airquality) # 列數
- '1'
- '2'
- '3'
- '4'
- '5'
- '6'
- '7'
- '8'
- '9'
- '10'
- '11'
- '12'
- '13'
- '14'
- '15'
- '16'
- '17'
- '18'
- '19'
- '20'
- '21'
- '22'
- '23'
- '24'
- '25'
- '26'
- '27'
- '28'
- '29'
- '30'
- '31'
- '32'
- '33'
- '34'
- '35'
- '36'
- '37'
- '38'
- '39'
- '40'
- '41'
- '42'
- '43'
- '44'
- '45'
- '46'
- '47'
- '48'
- '49'
- '50'
- '51'
- '52'
- '53'
- '54'
- '55'
- '56'
- '57'
- '58'
- '59'
- '60'
- '61'
- '62'
- '63'
- '64'
- '65'
- '66'
- '67'
- '68'
- '69'
- '70'
- '71'
- '72'
- '73'
- '74'
- '75'
- '76'
- '77'
- '78'
- '79'
- '80'
- '81'
- '82'
- '83'
- '84'
- '85'
- '86'
- '87'
- '88'
- '89'
- '90'
- '91'
- '92'
- '93'
- '94'
- '95'
- '96'
- '97'
- '98'
- '99'
- '100'
- '101'
- '102'
- '103'
- '104'
- '105'
- '106'
- '107'
- '108'
- '109'
- '110'
- '111'
- '112'
- '113'
- '114'
- '115'
- '116'
- '117'
- '118'
- '119'
- '120'
- '121'
- '122'
- '123'
- '124'
- '125'
- '126'
- '127'
- '128'
- '129'
- '130'
- '131'
- '132'
- '133'
- '134'
- '135'
- '136'
- '137'
- '138'
- '139'
- '140'
- '141'
- '142'
- '143'
- '144'
- '145'
- '146'
- '147'
- '148'
- '149'
- '150'
- '151'
- '152'
- '153'
- 'Ozone'
- 'Solar.R'
- 'Wind'
- 'Temp'
- 'Month'
- 'Day'
153
6
用cbind和rbind增加數據
myDf1myDf2A data.frame: 4 × 2
vec1
| vec2
| <dbl>
| <fct>
| 10
| a
| 20
| b
| 15
| c
| 40
| NA
|
A data.frame: 4 × 3
vec1
| vec3
| vec4
| <dbl>
| <lgl>
| <fct>
| 10
| TRUE
| l1
| 20
| FALSE
| l2
| 15
| TRUE
| l3
| 40
| TRUE
| l4
|
cbind(myDf1, myDf2) # 按列合并rbind(myDf1, myDf1) # 按行合并A data.frame: 4 × 5
vec1
| vec2
| vec1
| vec3
| vec4
| <dbl>
| <fct>
| <dbl>
| <lgl>
| <fct>
| 10
| a
| 10
| TRUE
| l1
| 20
| b
| 20
| FALSE
| l2
| 15
| c
| 15
| TRUE
| l3
| 40
| NA
| 40
| TRUE
| l4
|
A data.frame: 8 × 2
vec1
| vec2
| <dbl>
| <fct>
| 10
| a
| 20
| b
| 15
| c
| 40
| NA
| 10
| a
| 20
| b
| 15
| c
| 40
| NA
|
dataframe索引
myDf1A data.frame: 4 × 2
vec1
| vec2
| <dbl>
| <fct>
| 10
| a
| 20
| b
| 15
| c
| 40
| NA
|
myDf1$vec1 # 提取列vec1myDf1[, 2] # 提取數據df[row.num, col.num]Levels:
myDf1[, c(1,2)] # 提取第一列和第二列myDf1[c(1:5), c(1)] # 提取第一列的1到5行,A data.frame: 4 × 2
vec1
| vec2
| <dbl>
| <fct>
| 10
| a
| 20
| b
| 15
| c
| 40
| NA
|
subset和which函數
head(airquality)A data.frame: 6 × 6
Ozone
| Solar.R
| Wind
| Temp
| Month
| Day
| <int>
| <int>
| <dbl>
| <int>
| <int>
| <int>
| 41
| 190
| 7.4
| 67
| 5
| 1
| 36
| 118
| 8.0
| 72
| 5
| 2
| 12
| 149
| 12.6
| 74
| 5
| 3
| 18
| 313
| 11.5
| 62
| 5
| 4
| NA
| NA
| 14.3
| 56
| 5
| 5
| 28
| NA
| 14.9
| 66
| 5
| 6
|
下面代碼選擇day==1的列,但結果不顯示Temp列
subset(airquality, Day == 1, select = -Temp)A data.frame: 5 × 5
| Ozone
| Solar.R
| Wind
| Month
| Day
|
| <int>
| <int>
| <dbl>
| <int>
| <int>
| 1
| 41
| 190
| 7.4
| 5
| 1
| 32
| NA
| 286
| 8.6
| 6
| 1
| 62
| 135
| 269
| 4.1
| 7
| 1
| 93
| 39
| 83
| 6.9
| 8
| 1
| 124
| 96
| 167
| 6.9
| 9
| 1
|
which函數選擇day==1的列的索引
which(airquality$Day==1)airquality[which(airquality$Day==1), -c(4)]A data.frame: 5 × 5
| Ozone
| Solar.R
| Wind
| Month
| Day
|
| <int>
| <int>
| <dbl>
| <int>
| <int>
| 1
| 41
| 190
| 7.4
| 5
| 1
| 32
| NA
| 286
| 8.6
| 6
| 1
| 62
| 135
| 269
| 4.1
| 7
| 1
| 93
| 39
| 83
| 6.9
| 8
| 1
| 124
| 96
| 167
| 6.9
| 9
| 1
|
采樣
隨機從dataframe里分割樣本,比如分割訓練集和測試集
set.seed(100)trainIndex <- sample(c(1:nrow(airquality)), size=nrow(airquality)*0.7, replace=F) # 獲得驗證集數據,比例0.7trainIndex
- 102
- 112
- 151
- 4
- 55
- 70
- 98
- 135
- 7
- 43
- 140
- 51
- 25
- 2
- 68
- 139
- 48
- 32
- 85
- 91
- 121
- 16
- 116
- 93
- 45
- 30
- 128
- 130
- 87
- 95
- 97
- 124
- 29
- 92
- 31
- 54
- 41
- 105
- 117
- 24
- 144
- 145
- 63
- 65
- 9
- 153
- 20
- 14
- 78
- 88
- 3
- 36
- 27
- 46
- 59
- 100
- 69
- 47
- 149
- 96
- 138
- 12
- 142
- 132
- 56
- 22
- 82
- 53
- 103
- 5
- 44
- 28
- 52
- 141
- 42
- 15
- 57
- 79
- 37
- 26
- 114
- 120
- 109
- 122
- 111
- 35
- 58
- 74
- 137
- 123
- 90
- 118
- 75
- 127
- 101
- 18
- 8
- 99
- 77
- 143
- 19
- 119
- 23
- 72
- 66
- 84
- 106
# 訓練數據nrow(airquality[trainIndex, ])# 測試數據nrow(airquality[-trainIndex, ])107
46
合并數據
dataframe可以由公共列變量合并。在執行合并之前,不必對數據幀進行排序。如果“by”列具有不同的名稱,則可以使用by.x和by.y指定它們。內部/外部聯接、左聯接和右聯接可以使用merge()的all、all.x、all.y參數完成。在R控制臺中查看更多關于example(merge)的信息。
myDf1myDf2A data.frame: 4 × 2
vec1
| vec2
| <dbl>
| <fct>
| 10
| a
| 20
| b
| 15
| c
| 40
| NA
|
A data.frame: 4 × 3
vec1
| vec3
| vec4
| <dbl>
| <lgl>
| <fct>
| 10
| TRUE
| l1
| 20
| FALSE
| l2
| 15
| TRUE
| l3
| 40
| TRUE
| l4
|
merge(myDf1, myDf2, by="vec1") # 以vec1合并A data.frame: 4 × 4
vec1
| vec2
| vec3
| vec4
| <dbl>
| <fct>
| <lgl>
| <fct>
| 10
| a
| TRUE
| l1
| 15
| c
| TRUE
| l3
| 20
| b
| FALSE
| l2
| 40
| NA
| TRUE
| l4
|
3 高級函數
3.1 paste函數
paste()是一種拼接字符串并使用分隔符進行自定義的方法。有了清晰的理解,就可以方便地創建可以動態修改的長而復雜的字符串。
paste("a", "b") # 拼接字符串'a'和'b'包含空格 "a b"paste0("a", "b") # 無空格拼接字符串'a'和'b', "ab"paste("a", "b", sep="") # sep設置拼接符是什么,類似paste0paste(c(1:4), c(5:8), sep="") # "15" "26" "37" "48"paste(c(1:4), c(5:8), sep="", collapse="") # "15263748"paste0(c("var"), c(1:5)) # "var1" "var2" "var3" "var4" "var5"paste0(c("var", "pred"), c(1:3)) # "var1" "pred2" "var3"paste0(c("var", "pred"), rep(1:3, each=2)) # "var1" "pred1" "var2" "pred2" "var3" "pred3‘a b’
‘ab’
‘ab’
‘15263748’
- 'var1'
- 'var2'
- 'var3'
- 'var4'
- 'var5'
- 'var1'
- 'pred2'
- 'var3'
- 'var1'
- 'pred1'
- 'var2'
- 'pred2'
- 'var3'
- 'pred3'
3.2 處理日期
dateString <- "07/02/2021"myDate <- as.Date(dateString, format="%d/%m/%Y") # 設置字符串class(myDate) # 類別 "date"myDate‘Date’
2021-02-07
3.3 制作列連表
通過R語言的table函數可以制作列連表。
myDf1A data.frame: 4 × 2
vec1
| vec2
| <dbl>
| <fct>
| 10
| a
| 20
| b
| 15
| c
| 40
| NA
|
table(myDf1)vec2vec1 a b c 10 1 0 0 15 0 0 1 20 0 1 0 40 0 0 0同樣,對于dataframe,要在行中顯示的變量將作為table()的第一個參數,而列變量將作為第二個參數。
table(airquality$Month[c(1:60)], airquality$Temp[c(1:60)])56 57 58 59 61 62 64 65 66 67 68 69 72 73 74 75 76 77 78 79 80 81 82 84 85 5 1 3 2 2 3 2 1 1 3 2 2 2 1 1 2 0 1 0 0 1 0 1 0 0 0 6 0 0 0 0 0 0 0 1 0 1 0 0 1 2 1 1 4 3 2 2 2 0 2 1 1 87 90 92 93 5 0 0 0 0 6 2 1 1 13.4 列表
列表非常重要。如果需要捆綁不同長度和類別的對象,則可以使用列表來實現。
myList <- list(vec1, vec2, vec3, vec4)myList
- 10
- 20
- 15
- 40
- 'a'
- 'b'
- 'c'
- NA
- TRUE
- FALSE
- TRUE
- TRUE
- l1
- l2
- l3
- l4
Levels:
3.5 If-Else語句
if else語句結構如下
if(checkConditionIfTrue) { ....statements.. ....statements..} else { # place the 'else' in same line as '}' ....statements.. ....statements..}x<-2if(x>1) { print(x)}else { print("None")}[1] 23.6 for循環
格式如下
for(counterVar in c(1:n)){ .... statements..}for (x in c(1:5)) { print(x)}[1] 1[1] 2[1] 3[1] 4[1] 53.7 apply類別函數
apply
apply():按數據行或矩陣按行或列應用函數。
myData <- matrix(seq(1,16), 4, 4) # 生成一個矩陣myDataA matrix: 4 × 4 of type int
1
| 5
| 9
| 13
| 2
| 6
| 10
| 14
| 3
| 7
| 11
| 15
| 4
| 8
| 12
| 16
|
apply(myData, 1, FUN=min) # 1代表行,按行應用min函數apply(myData, 2, FUN=min) # 2代表列,按列應用min函數apply(data.frame(1:5), 1, FUN=function(x) {x^2} ) # square of 1,2,3,4,5lapply()
lapply():將函數應用于列表中的每個元素,或將其應用于數據框的列,并將結果作為列表返回
lapply(airquality, class)'integer' $Solar.R 'integer' $Wind 'numeric' $Temp 'integer' $Month 'integer' $Day 'integer'
sapply
sapply():將函數應用于列表的每個元素,或將其應用于dataframe的列,并將結果作為向量返回。
sapply(airquality, class)'integer' Solar.R 'integer' Wind 'numeric' Temp 'integer' Month 'integer' Day 'integer'
3.8 使用tryCatch()處理錯誤
該trycatch()函數在花括號內編寫了三個塊,try()我們前面看到的函數一樣,可以在第一組花括號內使用多行代碼。如果在第一個塊的任何一條語句中遇到錯誤,則生成的錯誤消息將存儲在err錯誤處理函數使用的變量(請參見下面的代碼)中。您可以選擇打印出此錯誤消息,進行其他計算或執行任何所需的操作。您甚至還可以在此函數內執行一組完全不同的邏輯,而不涉及錯誤消息。最后一組finally而不管是否發生錯誤,都必須執行。您可以選擇忽略將任何語句完全添加到此部分。
tryCatch( {1 <- 1; print("Lets create an error") }, # First blockerror=function(err){ print(err); print("Error Line")}, # Second Block(optional)finally = { print("finally print this")})# Third Block(optional)<simpleError in 1 <- 1: (do_set)賦值公式左手不對>[1] "Error Line"[1] "finally print this"4 參考
- ??R-Tutorial??
- 在 Jupyter Notebook 中使用R語言
- R語言個人筆記
|
|