上節咱們講到R語言中的基本數據類型,包括數值型,複數型,字符型,邏輯型以及對應的操做和不一樣數值類型之間的轉換。衆所周知,R語言的優點在於進行數據挖掘,大數據處理等方面,所以單個的數據並不能知足咱們的須要,因而向量,矩陣,數組,數據框等變量類型應運而生。算法
向量:與咱們在數學裏面所學到的向量不一樣,R語言中的向量相似於咱們在C語言中學習的數組,表示一個同種數據類型的數據集。數組
向量的建立:在R語言中使用c( )命令就建立了一個向量,任何類型的數據均可以組成向量,但一個向量裏面的數據最好類型一致,否則會發生一些變化。向量裏面的元素用","分隔。因而可知,當數值型,字符型,邏輯型的數據放在同一個向量時,字符型優先級高於數值型高於邏輯型,邏輯型的TRUE轉爲數值型的1,邏輯型的FALSE轉爲數值型的0函數
> a <- c(1,2,3,4,5) > a [1] 1 2 3 4 5 > b <- c("a","b","c","d") > b [1] "a" "b" "c" "d" > c <- c(1,2,"c",4,5) > c [1] "1" "2" "c" "4" "5" > d <- c(1,2,3,TRUE,4,5) > d [1] 1 2 3 1 4 5 > e <- c("a",TRUE,"c","d") > e [1] "a" "TRUE" "c" "d"
向量的元素個數:與計算字符串字符個數的函數nchar( )以及str_lenth( )不一樣,函數length( )用來計算向量中元素的個數。學習
向量的讀取:向量在建立過程當中,系統就自動給向量裏的每一個元素都分配了一個索引(1~N,N爲向量中元素個數,這與C語言,Python中都不一樣)大數據
讀取時用c[ m ]來讀取向量c中第m個向量spa
用c[ m:n ]讀取向量c中第m到n個向量翻譯
用c[x(m:n)]來表示讀取m到n的數乘以x,即c[2*(1:5)]就是讀取2*(1,2,3,4,5),也即第2,4,6,8,10五個數對象
> a <- c(1,2,3,4,5)
> length(a) [1] 5 > a[3] [1] 3 > a[2:4] [1] 2 3 4
> a[2*(1:5)] #不存在的數用NaN表示
[1] 2 4 NA NA NA
向量的計算:數值型的向量計算遵循計算法則,長度不一樣會警告,同時短的向量會順次從第一位開始填充到與長的向量相同的長度,開始運算。有關單個數值相關的計算均可以用到向量中,來進行整組相同的運算。blog
> a <- c(1,2,3,4,5) > b <- c(3,1,4,6,2) > a+b [1] 4 3 7 10 7 > a-b [1] -2 1 -1 -2 3 > a*b [1] 3 2 12 24 10 > a/b [1] 0.333 2.000 0.750 0.667 2.500 > a.^2 Error: object 'a.' not found > a^2 [1] 1 4 9 16 25 > log2(a) [1] 0.00 1.00 1.58 2.00 2.32 > sqrt(a) [1] 1.00 1.41 1.73 2.00 2.24 > a <- c(1,2,3,4,5) > c <- c(2,7,8) > a+c [1] 3 9 11 6 12 Warning message: In a + c : longer object length is not a multiple of shorter object length
其餘類型的向量,好比字符型以及邏輯型不能進行上述運算排序
邏輯型向量與數值型向量還能進行邏輯運算,返回值爲布爾型
> a <- c(1,2,3,4,5) > b <- c(3,1,4,6,2) > d <- c("a","b","c") > e <- c("d","e","f") > d+e Error in d + e : non-numeric argument to binary operator > a+d Error in a + d : non-numeric argument to binary operator > d & e Error in d & e : operations are possible only for numeric, logical or complex types > a & b [1] TRUE TRUE TRUE TRUE TRUE > f <- c(TRUE,TRUE,FALSE,FALSE,TRUE) > a & f [1] TRUE TRUE FALSE FALSE TRUE
與向量相關的其餘函數:最小值min、最大值max、返回最大值與最小值range、誰是最小值which.min、誰是最大值which.max、求和sum、全部向量元素的乘積prod、向量元素排序sort、向量元素平均值mean、樣本方差var,數據統計summary
> a <- c(1,2,3,4,5) > min(a) [1] 1 > max(x) [1] 0.873 > range(a) [1] 1 5 > which.min(a) [1] 1 > which.max(a) [1] 5 > sum(a) [1] 15 > prod(a) [1] 120 > sort(a) [1] 1 2 3 4 5 > sort(a,decreasing = TRUE) [1] 5 4 3 2 1 > mean(a) [1] 3 > var(a) [1] 2.5 > summary(a) Min. 1st Qu. Median Mean 3rd Qu. Max. 1 2 3 3 4 5
矩陣:矩陣至關於咱們在C語言中學習的二位數組,只不過在R語言中對矩陣的處理比在C語言中要方便快速得多
矩陣的建立:
經常使用matrix(data=NA, nrow = 1, ncol = 1, byrow = FALSE, dimnames = NULL)
參數含義以下:
data:矩陣的元素,默認爲NA,即未給出元素值的話,各項爲NA
nrow:矩陣的行數,默認爲1;
ncol:矩陣的列數,默認爲1;
byrow:元素是否按行填充,默認按列;
dimnames:以字符型向量表示的行名及列名,dimnames( )能夠跟參數,參數需爲向量格式,第一個向量爲行名,第二個向量爲列名
> mydata <- c(1:20) > mydata [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 > myarray <- matrix(mydata,nrow = 4,ncol = 5) > myarray [,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 > cnames <- c("C1","C2","C3","C4","C5") > rnames <- c("R1","R2","R3","R4") > myarray <- matrix(mydata,nrow = 4,ncol = 5,dimnames = list(rnames,cnames)) > myarray C1 C2 C3 C4 C5 R1 1 5 9 13 17 R2 2 6 10 14 18 R3 3 7 11 15 19 R4 4 8 12 16 20 > myarray2 <- matrix(mydata,nrow = 4,ncol = 5,byrow = TRUE,dimnames = list(rnames,cnames)) > myarray2 C1 C2 C3 C4 C5 R1 1 2 3 4 5 R2 6 7 8 9 10 R3 11 12 13 14 15 R4 16 17 18 19 20
矩陣的拼接:用rbind(用列拼接,拼接後的列數跟兩矩陣相同)函數或者cbind(用行拼接,拼接後的行數跟兩矩陣相同)函數能夠將兩個向量或者矩陣合併爲一個矩陣。注意須要拼接的兩個矩陣對應行和列的數量要相等,而且若是有行名和列名的話,要求對應行行名和列名也必須相同。
> mydata <- c(1:20) > mydata [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 > cnames <- c("C1","C2","C3","C4","C5") > rnames <- c("R1","R2","R3","R4") > myarray <- matrix(mydata,nrow = 4,ncol = 5) > myarray [,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 > myarray <- matrix(mydata,nrow = 4,ncol = 5,dimnames = list(rnames,cnames)) > myarray C1 C2 C3 C4 C5 R1 1 5 9 13 17 R2 2 6 10 14 18 R3 3 7 11 15 19 R4 4 8 12 16 20 > myarray2 <- matrix(mydata,nrow = 4,ncol = 5,byrow = TRUE,dimnames = list(rnames,cnames)) > myarray2 C1 C2 C3 C4 C5 R1 1 2 3 4 5 R2 6 7 8 9 10 R3 11 12 13 14 15 R4 16 17 18 19 20 > myarray3 <- matrix(c(1:15),nrow=3,ncol=5) > myarray3 [,1] [,2] [,3] [,4] [,5] [1,] 1 4 7 10 13 [2,] 2 5 8 11 14 [3,] 3 6 9 12 15 > myarray4 <- matrix(c(1:15),nrow=3,ncol=5,dimnames=list(c("R11","R12","R13"),cnames)) > myarray4 C1 C2 C3 C4 C5 R11 1 4 7 10 13 R12 2 5 8 11 14 R13 3 6 9 12 15 > cbind(myarray2,myarray4) #按行進行組合,行數不一致,分別爲3和4 Error in cbind(myarray2, myarray4) : number of rows of matrices must match (see arg 2) > rbind(myarray2,myarray4) #按列進行組合 C1 C2 C3 C4 C5 R1 1 2 3 4 5 R2 6 7 8 9 10 R3 11 12 13 14 15 R4 16 17 18 19 20 R11 1 4 7 10 13 R12 2 5 8 11 14 R13 3 6 9 12 15 >matrix(c(1:16),nrow=4,ncol=4,dimnames=list(c("R11","R12","R13","R14"),c("C11","C12","C13","C14"))) > myarray5 C11 C12 C13 C14 R11 1 5 9 13 R12 2 6 10 14 R13 3 7 11 15 R14 4 8 12 16 > rbind(myarray2,myarray5) #按列進行組合,列名不一致 Error in rbind(myarray2, myarray5) : number of columns of matrices must match (see arg 2)
矩陣元素的讀取:跟向量讀取差很少,多加了一個列的索引而已
經常使用爲c[a,b],意爲讀取第a行b列的數據
也可使用c[,b]讀取第b列整個列的數據,返回值爲向量
> myarray5[2,3] [1] 10 > myarray5[,3] R11 R12 R13 R14 9 10 11 12
矩陣操做中經常使用的函數:
+, -, * , / 矩陣的四則運算,對應位置的元素進行運算要求矩陣的維數必須相同
t() 矩陣的行列轉置
colSums() 分別對矩陣的每一列進行求和
rowSums() 分別對矩陣的每一行進行求和
colMeans() 分別對矩陣的每一列進行求平均值
rowMeans() 分別對矩陣的每一行進行求平均值
det() 解方程的行列式
crossprod() 解兩個矩陣的內積
outer() 解兩個矩陣的外積,又叫叉積%*%矩陣乘法,要求第一個矩陣的列數與行數相同
diag() 對矩陣取對角元素,若對象爲向量(無論有沒有缺失值),則生成以向量爲對角元素的對角矩陣
solve() 在矩陣可逆的狀況下,對矩陣求逆矩陣
eigen() 對矩陣求解特徵值和特徵向量
Data Frame通常被翻譯爲數據框,感受就像是R中的表,由行和列組成,與Matrix不一樣的是,每一個列能夠是不一樣的數據類型,而Matrix是必須相同的。Data Frame每一列有列名,每一行也能夠指定行名。若是不指定行名,那麼就是從1開始自增的Sequence來標識每一行。
數據框的建立:使用data.frame( )函數。函數裏面的每個參數包含列索引與對應的值
student<-data.frame(ID=c(11,12,13),Name=c(「Devin」,」Edward」,」Wenli」),Gender=c(「M」,」M」,」F」),Birthdate=c(「1984-12-29″,」1983-5-6」,」1986-8-8」))另外也可使用read.table()或者read.csv()讀取一個文本文件,返回的也是一個Data Frame對象。