--- title: "U08_MultiDimData" author: "Feng-Li Lian" date: "2020/11/4" output: html_document --- ```{r setup, include=FALSE} knitr::opts_chunk$set(echo = TRUE) ``` ## R Markdown for # Unit 08: 多維度資料格式 # 矩陣 – matrix # 建立矩陣與性質 ```{r} A <- matrix( c( 1, -5, 4, 3, 6, -2 ), nrow = 2, ncol = 3 ) # by column A ``` ```{r} B <- matrix( c( 1, -5, 4, 3, 6, -2 ), nrow = 2, ncol = 3, byrow = TRUE) # by row B ``` 看看 A 是什麼類型 ```{r} class(A) ``` 看看 A 的維度 ```{r} dim(A) ``` 看看 A 的對應屬性與參數 ```{r} attributes(A) ``` 看看 A 的 橫列數量 ```{r} nrow(A) ``` 看看 A 的 橫列數量 ```{r} dim(A)[1] ``` 看看 A 的 直行數量 ```{r} ncol(A) ``` 看看 A 的 直行數量 ```{r} dim(A)[2] ``` # 矩陣與向量 ```{r} A <- matrix( c( 1, -5, 4, 3, 6, -2 ), nrow = 2, ncol = 3 ) A ``` A 的內容物的特性 ```{r} u <- as.numeric(A) u ``` A 的內容物的特性 ```{r} v <- c(A) v ``` A 的內容物的特性的參數數據 ```{r} dim(v) length(v) nrow(A) * ncol(A) length(A) ``` # 零矩陣與單位矩陣 ```{r} matrix( 0, nrow = 2, ncol = 3 ) matrix( 0, nrow = 3, ncol = 3 ) diag( 0, nrow = 3 ) diag( 3 ) diag( 2.5, nrow = 3 ) diag( c(1, 2, 3), nrow = 3 ) diag( c(1, 2, 3) ) ``` # 矩陣的 加 減 乘 ```{r} A <- matrix( 1:9, nrow = 3, ncol = 3 ) B <- matrix( 1:9, nrow = 3, ncol = 3, byrow = TRUE ) A + B A - B A %*% B A * B ``` # 用指標的方式取出某個分量 ```{r} A <- matrix( 1:9, nrow = 3, ncol = 3 ) B <- matrix( 1:9, nrow = 3, ncol = 3, byrow = TRUE ) A B A[2, 3] A[1, 2] A[4] c(A)[4] R1 <- A[1,] R1 class(R1) R1[1] R1 * B R1 %*% B ``` # 成為一個矩陣 ```{r} A <- matrix( 1:9, nrow = 3, ncol = 3 ) B <- matrix( 1:9, nrow = 3, ncol = 3, byrow = TRUE ) A B ``` ```{r} R2 <- A[ 1, , drop = FALSE ] R2[1, 2] R2 %*% B as.matrix(R1) R2 R1 ``` ```{r} R4 <- A[ , 1] R4 R4 <- A[ , 1:2] R4 ``` ```{r} R2 <- A[ 1, , drop = FALSE ] R2[1, 2] R2 ``` ```{r} R2 <- A[ 1, ] R2 ``` ```{r} R2 <- A[ 1, , drop = FALSE] R2 ``` ```{r} R1 <- A[ 1, ] class(R1) ``` ```{r} R2 <- A[ 1, , drop = FALSE ] class( R2 ) ``` # 用指標的方式取出某個分量 ```{r} A <- matrix( 1:9, nrow = 3, ncol = 3 ) B <- matrix( 1:9, nrow = 3, ncol = 3, byrow = TRUE ) A B ``` ```{r} A[2, 3] A[1, 2] A[4] c(A)[4] ``` ```{r} R1 <- A[ 1, ] class(R1) R1[ 1 ] R1 * B R1 %*% B ``` # 成為一個矩陣 ```{r} A <- matrix( 1:9, nrow = 3, ncol = 3 ) B <- matrix( 1:9, nrow = 3, ncol = 3, byrow = TRUE ) A B ``` ```{r} R2 <- A[ 1, , drop = FALSE ] class( R2 ) R2[ 1, 2 ] R2 %*% B ``` # 形成另外一個矩陣或向量 ```{r} A <- matrix( 1:9, nrow = 3, ncol = 3 ) E <- A[ c(1, 3), ] class( E ) E ``` ```{r} F <- A[ c(1, 3), 2 ] class( F ) F ``` # 結合矩陣 ```{r} C <- matrix( 1:4, nrow = 2, ncol = 2 ) D <- matrix( 1:6, nrow = 2, ncol = 3 ) C D ``` ```{r} cbind( C, D ) ``` ```{r} E <- matrix( 1:4, nrow = 2, ncol = 2 ) F <- matrix( 1:6, nrow = 3, ncol = 2 ) E F ``` ```{r} rbind(E, F) ``` # 轉置矩陣 ```{r} A <- matrix( 1:9, nrow = 3, ncol = 3 ) A ``` ```{r} t( A ) t( A ) %*% A diag( A ) sum( diag( A ) ) ``` # 矩陣的行列式值與反矩陣 ```{r} A <- matrix( c(1, 0, 0, 3, 0.5, 0, 2, 1, 0.25), nrow = 3, ncol = 3 ) A ``` ```{r} det(A) ``` ```{r} Ainv <- solve(A) Ainv ``` ```{r} Ainv %*% A ``` ```{r} A <- matrix( c(1, 0, 0, 3, 0.5, 0, 2, 1, 0.25), nrow = 3, ncol = 3 ) A ``` ```{r} b <- c(2, 1, 3) b ``` ```{r} solve( A, b ) ``` ```{r} A b ``` # 陣列 – array ```{r} array( 1:12 ) array( , c(3, 4) ) array( 1:12, c(3, 4) ) array( data = 1:12, dim = c(3, 4) ) array( data = 1:60, dim = c(3, 4, 5) ) args( array ) ``` # 列表 ```{r} camera <- list(c("Leica", "Pentax", "Olympus", "Nikon"), c(1.2, 3.4), c("red", "green", "blue")) camera ``` ```{r} camera <- list(brand = c("Leica", "Pentax", "Olympus", "Nikon"), real.number = c(1.2, 3.4), color = c("red", "green", "blue")) camera ``` # 索引方式 1 – 使用 [ ] ```{r} a1 <- camera[ 1 ] a1 camera[ "brand" ] class( a1 ) ``` #索引方式 2 – 使用 [[ ]] ```{r} a2 <- camera[[ 1 ]] a2 camera[[ "brand" ]] class( a2 ) ``` # 索引方式 3 – 使用 $ ```{r} a3 <- camera$brand a3 class( a3 ) ``` # 索引方式 的比較 ```{r} a1 # a1 是列表 a2 # a2 是向量 a3 # a3 是向量 ``` ```{r} class( a1 ) class( a2 ) class( a3 ) ``` ```{r} camera[ 1 ][ 1 ] ``` ```{r} a1[ 1 ] a2[ c(1, 2) ] a3[ 2 ] ``` ```{r} a1 a1[1] a1[ 1 ] ``` ```{r} camera[ 1 ][ 1 ] a1[ 1 ] a2[ c(1, 2) ] a3[ 2 ] ``` ```{r} camera[ 1 ][ 1 ] a1[ 1 ] a2[ c(1, 2) ] a3[ 2 ] a1[ 1 ] a2[ c(1, 2) ] a3[ 2 ] ``` ```{r} a1 # a1 是列表 a2 # a2 是向量 a3 # a3 是向量 class( a1 ) class( a2 ) class( a3 ) ``` ```{r} camera[ 1 ][ 1 ] a1[ 1 ] a2[ c(1, 2) ] a3[ 2 ] ``` # 資料框 ```{r} x1 <- c("father", "mother", "brother", "sister") x2 <- c("Leica", "Pentax", "Olympus", "Nikon") x3 <- c("gold", "red", "green", "blue") x4 <- c(2, 1, 1, 2) ``` ```{r} camera <- data.frame(member = x1, brand = x2, color = x3, amount = x4) camera x1 x2 x3 x4 camera ``` # 資料框 – 特徵 ```{r} camera class(camera) names(camera) colnames(camera) # column names rownames(camera) # row names ``` # 資料框 – 內容 ```{r} camera camera$brand camera[, 2] camera[, "brand"] ``` # 資料框 – 加入一行數據 ```{r} x5 <- c(8, 3, 2, 2) camera$cost <- x5 camera ``` # 資料框 – 改變名稱 ```{r} test <- camera colnames(test)[c(4, 5)] <- c("number", "money") test ``` # 資料框 – 捉取某一欄位的數據 # 品牌 (brand) 為 Leica 的資料 ```{r} camera[ camera$brand == "Leica", ] subset( camera, brand == "Leica" ) ``` # 品牌 (brand) 為 Leica 或 Nikon 的資料 ```{r} camera[ camera$brand %in% c("Leica", "Nikon"), ] subset( camera, brand %in% c("Leica", "Nikon") ) ``` # 價格 (cost) 大於 2 的資料 ```{r} camera[ camera$cost > 2, ] subset( camera, cost > 2) ``` # 資料框 – 把矩陣轉為資料框 ```{r} A <- matrix( c(1, -5, 4, 3, 6, -2 ), nrow = 2, ncol = 3 ) rownames( A ) # row names colnames( A ) # column names ``` ```{r} D <- as.data.frame( A ) names( D ) colnames( D ) rownames( D ) D$V1 A D ``` # 因子 ```{r} x <- c("R", "G", "B", "R", "R", "B", "R", "G", "G") class( x ) y <- factor( x ) class( y ) ``` # 這些等級可以用整數來表示 ```{r} as.integer( y ) levels( y ) levels( y )[2] nlevels( y ) levels( y )[ as.integer(y) ] ``` # 因子 – 5的等級,3個分量 ```{r} gl( 5, 3 ) # factor levels up to 5 with repeats of 3 gl( n = 5, k = 3 ) class( gl( 5, 3 ) ) gl( 5, 2, 13 ) gl( n = 5, k = 2, length = 13 ) is.factor( gl(5, 2, 13) ) ``` ## Including Plots ```{r pressure, echo=FALSE} plot(pressure) ``` Note that the `echo = FALSE` parameter was added to the code chunk to prevent printing of the R code that generated the plot.