1. 程式人生 > >R語言數據結構二

R語言數據結構二

bind c語言 not found ros see 最小值 pos operation 類型

上節我們講到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個向量

用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

向量的計算:數值型的向量計算遵循計算法則,長度不同會警告,同時短的向量會順次從第一位開始填充到與長的向量相同的長度,開始運算。有關單個數值相關的計算都可以用到向量中,來進行整組相同的運算。

> 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對象。

R語言數據結構二