(windows安裝安裝路徑不要出現中文,不然RStudio找不到R軟件)
1、R中的數據結構
1.1向量,標量
1.2矩陣
1.3數組
1.4列表
1.5數據框
1.6因子
1.7時間序列
2、R語言基礎
2.1運算符
R 語言賦值使用的是左箭頭 <- 符號,不過一些新版本也支持等號=,也可以用->符號(最新版本)。
2.2變量的定義
R 語言的有效的變量名稱由字母,數字以及點號 . 或下划線 _ 組成。
變量名稱以字母或點開頭。
注意:首字母為“.”點,或者英文字母,“.”號后面不能直接跟數字
demo
> var.1 = c(0,1,2,3)
> print(var.1)
[1] 0 1 2 3
> var.2 = c("Hello","R")
> print(var.2)
[1] "Hello" "R"
> var.3 <= c("Hello","Java")
錯誤: 找不到對象'var.3'
#符號錯誤 <= 應該是 <-
> var.3 <- c("Hello","Java")
> print(var.3)
[1] "Hello" "Java"
> c(true,1)->var.4
錯誤: 找不到對象'true'
#布爾值大小寫敏感
> c(TRUE,1) -> var.4
> print(var.4)
[1] 1 1
>
列出已定義的變量ls()函數
> var.1 = c(0,1,2,3)
> var.2 = c("Hello","R")
> var.3 <- c("Hello","Java")
> c(TRUE,1) -> var.4
> print(ls())
[1] "var.1" "var.2" "var.3" "var.4"
>
刪除變量可以使用rm()函數
> print(ls())
[1] "var.1" "var.2" "var.3" "var.4"
> rm(var.1)
> print(ls())
[1] "var.2" "var.3" "var.4"
>
linux中進入和退出R軟件
[root@VM-0-3-centos ~]# R
R version 3.6.0 (2019-04-26) -- "Planting of a Tree"
Copyright (C) 2019 The R Foundation for Statistical Computing
Platform: x86_64-redhat-linux-gnu (64-bit)
R是自由軟件,不帶任何擔保。
在某些條件下你可以將其自由散布。
用'license()'或'licence()'來看散布的詳細條件。
R是個合作計划,有許多人為之做出了貢獻.
用'contributors()'來看合作者的詳細情況
用'citation()'會告訴你如何在出版物中正確地引用R或R程序包。
用'demo()'來看一些示范程序,用'help()'來閱讀在線幫助文件,或
用'help.start()'通過HTML瀏覽器來看幫助文件。
用'q()'退出R.
> q()
Save workspace image? [y/n/c]: n
運行R腳本,在命令窗口使用Rscript來執行該腳本
#linux 創建編輯腳本文件 並運行腳本文件
[root@VM-0-3-centos zxgtest]# touch test.R
[root@VM-0-3-centos zxgtest]# vim test.R
[root@VM-0-3-centos zxgtest]# Rscript test.R
[1] 1 2 3 4 5
2.3、常見的函數
輸入輸出print()函數
> print("Hello R!")
[1] "Hello R!"
>
拼接cat()函數
> cat("張三","今年",18,"歲",'\n')
張三 今年 18 歲
>
cat()函數輸出到文件中,append=TRUE輸出到文件中不覆蓋,追加到后面
> cat("輸出到文件中",file="/zxgtest/test.txt")
> cat("追加數據不覆蓋之前文件數據",file="/zxgtest/test.txt",append=TRUE)
sink() 函數可以把控制台輸出的文字直接輸出到文件中去:
> sink("/zxgtest/sinkfile.txt")
#這樣會將控制台輸出的數據全部存儲到指定的文件中,控制台不輸出數據,顯然這不是我們需要的效果
#split=TRUE 可以實現既將控制台輸出的文件保存到文件中,又在控制台顯示
> sink("/zxgtest/sinkfile.txt",split=TRUE)
#如果想取消輸出到文件,可以調用無參數的 sink :
>sink()
readLines() 從文件中讀入數據
獲取當前工作目錄,設置當前工作目錄,查看當前工作目錄
# 當前工作目錄
print(getwd())
# 設置當前工作目錄
setwd("/zxgtwst/test2")
# 查看當前工作目錄
print(getwd())
3、R語言兩種注釋方式
3.1、單行注釋 #
# 變量賦值
a <- 9
3.2、多行注釋"
if(TRUE) {
"
這是一個多行注釋的實例
注釋內容放在單引號或雙引號之間
"
}
4、基礎運算
優先級 | 符號 | 含義 |
1 | () | 括號 |
2 | ^ | 乘方運算 |
3 | %% | 整除求余 |
%/% | 整除 | |
4 | * | 乘法 |
/ | 除法 | |
5 | + | 加法 |
- | 減法 |
> 1 + 2*3
[1] 7
> (1+2)*3
[1] 9
> 3 / 4
[1] 0.75
> 3.4-1.2
[1] 2.2
> 1 -4 * 0.5 ^ 3
[1] 0.5
> 8 / 3 %% 2
[1] 8
> 8 / 4 %% 2
[1] Inf
> 3 %% 2^2
[1] 3
> 10 / 3 %/% 2
[1] 10
關系運算符(> < == != >= <=)
> v <- c(2,4,6,9)
> t <- c(1,4,7,9)
> print(v>t)
[1] TRUE FALSE FALSE FALSE
> print(v < t)
[1] FALSE FALSE TRUE FALSE
> print(v == t)
[1] FALSE TRUE FALSE TRUE
> print(v!=t)
[1] TRUE FALSE TRUE FALSE
> print(v>=t)
[1] TRUE TRUE FALSE TRUE
> print(v<=t)
[1] FALSE TRUE TRUE TRUE
>
邏輯運算
運算符 | 描述 |
& | 元素邏輯與運算符,將第一個向量的每個元素與第二個向量的相對應元素進行組合,如果兩個元素都為TRUE則記過為TRUE,否則為FALSE |
| | 元素邏輯或運算符,將第一個向量的每個元素與第二個向量的相對應元素進行組合,如果兩個元素中有一個為TRUE,則結果為TRUE,如果都為FALSE,則返回FALSE |
! | 邏輯非運算符,返回向量每個元素相反的邏輯值,如果元素為TRUE則返回FALSE,如果元素為FALSE則返回TRUE |
&& | 邏輯與運算符,只對兩個向量對一個元素進行判斷,如果兩個元素都為TRUE,結果為TRUE,否則為FALSE |
|| | 邏輯或運算符,只對兩個向量,對第一個元素進行判斷,如果兩個元素中一個為TRUE,則結果為TRUE,如果都為FALSE則返回FALSE |
> v = c(3,1,TRUE,2+3i)
> t = c(4,1,FALSE,2+3i)
> print(v&t)
[1] TRUE TRUE FALSE TRUE
> print(v|t)
[1] TRUE TRUE TRUE TRUE
> print(!t)
[1] FALSE FALSE TRUE FALSE
> p = c(3,0,TRUE,2+2i)
> k = c(1,3,TRUE,2+3i)
> print(p&&k)
[1] TRUE
> print(p||k)
[1] TRUE
#&&和||只對第一個元素進行比較
賦值運算符
運算符 | 描述 |
<-、=、<<- | 向左賦值 |
->、->> | 向右賦值 |
其他運算符
運算符 | 描述 |
: | 冒號運算符,用於創建一系列數字的向量 |
%in% | 用於判斷元素是否再向量里,返回布爾值,有的話返回TRUE,沒有的話返回FALSE |
%*% | 用於矩陣與它轉置的矩陣相乘 |
> v <- 1:10 #1到10的向量
> print(v)
[1] 1 2 3 4 5 6 7 8 9 10
> s = c(1,2,3)
> print(s)
[1] 1 2 3
> v1 = 3
> v2 = 20
> print(v1 %in% v) #判斷數字是否再向量v中
[1] TRUE
> print(v2 %in% v)
[1] FALSE
> M = matrix(c(2,6,5,1,10,4),nrow = 2,ncol = 3,byrow = TRUE)#矩陣與它置換的矩陣相乘
> t = M %*% t(M)
> print(t)
[,1] [,2]
[1,] 65 82
[2,] 82 117
>
常用數學函數
函數 | 說明 |
sqrt(n) | n的平方根 |
exp(n) | 自然常數e的n次方 |
log(m,n) | m的對數函數,返回n的幾次方等於m |
log10(m) | 相當於log(m,10) |
> sqrt(4)
[1] 2
> sqrt(16)
[1] 4
> exp(1)
[1] 2.718282
> exp(2)
[1] 7.389056
> log(2,4)
[1] 0.5
> log10(10000)
[1] 4
> log(10,100)
[1] 0.5
>
取整函數
名稱 | 參數模型 | 含義 |
round | (n) | 對n四舍五入取整 |
round | (n,m) | 對n保留m位小數四舍五入 |
ceiling | (n) | 對n向上取整 |
floor | (n) | 對n向下取整 |
> round(1.5) #round函數謹慎使用,有時5也會舍去
[1] 2
> round(2.5)
[1] 2
> round(3.5)
[1] 4
> round(4.5)
[1] 4
數學運算 三角函數、反三角函數
> sin(pi/6)
[1] 0.5
> cos(pi/4)
[1] 0.7071068
> tan(pi/3)
[1] 1.732051
> asin(0.5)
[1] 0.5235988
> acos(0.7071068)
[1] 0.7853981
> atan(1.732051)
[1] 1.047198
#下面幾個都是正態分布的函數,名字以norm結尾,代表“正態分布”
#前綴 d 概率密度函數
# p 概率密度積分函數(從無窮小到x的積分)
# q 分位數函數
# r 隨機數函數(常用於概率仿真)
> dnorm(0)
[1] 0.3989423
> pnorm(0)
[1] 0.5
> qnorm(0.95)
[1] 1.644854
> rnorm(3,5,2) #產生3個平均值為5,標准差為2的正態隨機數
[1] 1.351745 5.329550 2.958539
R 語言除了含有正態分布函數以外還有泊松分布 (pois, Poisson) 等常見分布函數 --------“概率論與數理統計”
注意:個位數字為4的話round函數
5、數據類型(數字、邏輯、文本)
數字常量:一般型、科學計數法
邏輯類型:常量值只有 TRUE和FALSE 區分大小寫。
對象類型:(向量、列表、矩陣、數組、因子、數據框)
下面詳細介紹詳細介紹對象類型
5.1、向量(Vector)
最常見的是二維向量,在平面坐標系中必然會用到。(可以看作java中的數組)。
c()是創造向量的函數。
向量中的每個元素可以通過下標單獨取出。(下標代表的第幾個,起始值為1)(java等其他語言中的下標基本上從0開始)
注意:二維向量和其他維度的向量運算失去數學意義,會出現警告。
> a=c(1,2,3,6,11,25,64,126)
> a[4]
[1] 6
#通過下標獲取單獨的值
> a[1:4]
[1] 1 2 3 6
#獲取1到4的值
> a[c(1,3,6)]
[1] 1 3 25
#獲取1,3,6位置的值
> a[c(-1,-3)]
[1] 2 6 11 25 shuchu 64 126
>
#去掉1,3位置的值,並輸出向量
向量支持標量運算
> c(1.1,1.2,1.3) - 0.5
[1] 0.6 0.7 0.8
> a = c(1,2,4)
> a ^ 2
[1] 1 4 16
常用的數學運算函數也適用向量運算 sqrt、exp、sort、rev、order
> a = c(1,3,5,2,4,6)
> sort(a)
[1] 1 2 3 4 5 6
> rev(a)
[1] 6 4 2 5 3 1
> order(a)
[1] 1 4 2 5 3 6
> a[order(a)]
[1] 1 2 3 4 5 6
#order(a) 函數為排序后a向量的下標
R中有完善的統計函數
sum、mean(求平均值)、var(方差)、sd(標准差)、min(最小值)、max(最大值)、range(取值范圍)(二維向量最大值和最小值)
> sum(1:10)
[1] 55
> sd(1:10)
[1] 3.02765
> range(1:10)
[1] 1 10
向量生成,生成等差數列,可以用seq函數
> seq(1,9,2)
[1] 1 3 5 7 9
> seq(1,8,2)
[1] 1 3 5 7
#seq(a,b,c) 從a到b,步長為c
> seq(1,2,length.out=3)
[1] 1.0 1.5 2.0
# 從m到n數列的長度為3
> rep(0, 5)
[1] 0 0 0 0 0
#重復數字0 5次
向量中常會用到NA和NULL,介紹與區別
NA代表的缺失,NULL代表的不存在
NA缺失就像占位符,代表這里沒有一個值,但位置存在
NULL代表的就是數據不存在
> length(c(NA, NA, NULL))
[1] 2
> c(NA, NA, NULL, NA)
[1] NA NA NA
#NULL在R向量中沒有任何意義
which比較罕見的向量邏輯型處理函數
> c(1,2,3) > 2 [1] FALSE FALSE TRUE > a = c(1,2,3)>2 > b = c(1,2,3) > print(a) [1] FALSE FALSE TRUE > print(b) [1] 1 2 3 > which(a) [1] 3 > b = c(1,2,3,4,5,6) > which(a) [1] 3 > a = b >2 > which(a) [1] 3 4 5 6 > vector = c(10,40,78,64,53,62,69,70) > print(vector[which(vector >= 60 & vector < 70)]) [1] 64 62 69 > #從一個線性表中篩選大於等於 60 且小於 70 的數據 類似的函數還有any() all() 等 > all(c(TRUE,TRUE,TRUE)) [1] TRUE > all(c(TRUE,FALSE,TRUE)) [1] FALSE > any(c(TRUE,FALSE,FALSE)) [1] TRUE > any(c(FALSE,FALSE,FALSE)) [1] FALSE
5.2、字符串(常用的對字符串操作的函數)
> toupper("Hello R") #轉換為大寫 [1] "HELLO R" > tolower("Hello R") #轉換為小寫 [1] "hello r" > nchar("漢字",type="bytes") #統計字節長度 [1] 6 > nchar("中文",type="byte") [1] 6 > nchar("漢字",type="char") #統計字符數 [1] 2 > substr("unbelievable",1,5) #截取字符串,從1到5 [1] "unbel" > substring("unbelievable",5) #截取字符串,從5到結束 [1] "lievable" > as.numeric("24") #將字符串轉化為數字 [1] 24 > as.character(12.34) #將數字轉化為字符串 [1] "12.34" > strsplit("hello_java_learn_R","_") #分隔符拆分字符串 [[1]] [1] "hello" "java" "learn" "R" > gsub("/","-","2021/08/21") #替換字符串 [1] "2021-08-21" >
R支持perl語言格式的正則表達式
5.2、矩陣
> vector = c(1,2,3,4,5,6) > matrix(vector,2,3) [,1] [,2] [,3] [1,] 1 3 5 [2,] 2 4 6
#初始化內容是由一個向量來傳遞的,其次要輸入矩陣有多少行多少列 > vector = c(1,2,3,4,5) > matrix(vector,2,3) [,1] [,2] [,3] [1,] 1 3 5 [2,] 2 4 1 Warning message: In matrix(vector, 2, 3) : 數據長度[5]不是矩陣行數[2]的整倍
#當初始化向量數量不足時會給出警告 > vector = c(1,2,3,4,5,6) > matrix(vector,2,3,byrow=TRUE) [,1] [,2] [,3] [1,] 1 2 3 [2,] 4 5 6
#按行來初始化矩陣 > matrix(vector,2,3,byrow=FALSE) [,1] [,2] [,3] [1,] 1 3 5 [2,] 2 4 6
#按列初始化矩陣 > m1 = matrix(vector,2,3,byrow=FALSE) > m1[1,1] [1] 1 > m1[1,2] [1] 3
直接訪問矩陣的具體元素 > colnames(m1) = c("x","y","z") > rownames(m1) = c("a","b") > m1 x y z a 1 3 5 b 2 4 6 > #設置行列的名稱,這個過程通過字符串向量批量完成
> m1["b",]
x y z
2 4 6
> m1["b","a"]
Error in m1["b", "a"] : 下標出界
> m1["a","x"]
[1] 1
> m1["b","y"]
[1] 4
#通過設定的名稱訪問具體的元素
矩陣的運算
> m1 = matrix(c(1,2,3,4),2,2) > m2 = matrix(c(5,6,7,8),2,2) > m1%*%m2 [,1] [,2] [1,] 23 31 [2,] 34 46
#矩陣的乘法運算 > A = matrix(c(1,2,3,4),2,2) > solve(A) [,1] [,2] [1,] -2 1.5 [2,] 1 -0.5
#逆矩陣 > A [,1] [,2] [1,] 1 3 [2,] 2 4 > apply(A,1,sum) [1] 4 6
8 > apply(A,2,sum) [1] 3 7