R語言學習(瑞士軍刀)


(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

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM