# Unit 08: 多維度資料格式 # 矩陣 – matrix # 建立矩陣與性質 A <- matrix( c( 1, -5, 4, 3, 6, -2 ), nrow = 2, ncol = 3 ) # by column A B <- matrix( c( 1, -5, 4, 3, 6, -2 ), nrow = 2, ncol = 3, byrow = TRUE) # by row B class(A) dim(A) attributes(A) nrow(A) dim(A)[1] ncol(A) dim(A)[2] # 矩陣與向量 A <- matrix( c( 1, -5, 4, 3, 6, -2 ), nrow = 2, ncol = 3 ) A u <- as.numeric(A) u v <- c(A) v dim(v) length(v) nrow(A) * ncol(A) length(A) # 零矩陣與單位矩陣 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) ) # 矩陣的 加 減 乘 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 # 用指標的方式取出某個分量 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, 2] R1 * B R1 %*% B # 成為一個矩陣 A <- matrix( 1:9, nrow = 3, ncol = 3 ) B <- matrix( 1:9, nrow = 3, ncol = 3, byrow = TRUE ) R2 <- A[ 1, , drop = FALSE ] R2[1, 2] R2 %*% B as.matrix(R1) R2 R1 R4 <- A[ , 1] R4 R4 <- A[ , 1:2] R4 R2 <- A[ 1, , drop = FALSE ] R2[1, 2] R2 R2 <- A[ 1, ] R2 R2 <- A[ 1, , drop = FALSE] R2 R1 <- A[ 1, ] class(R1) R2 <- A[ 1, , drop = FALSE ] class( R2 ) # 用指標的方式取出某個分量 A <- matrix( 1:9, nrow = 3, ncol = 3 ) B <- matrix( 1:9, nrow = 3, ncol = 3, byrow = TRUE ) A[2, 3] A[1, 2] A[4] c(A)[4] R1 <- A[ 1, ] class(R1) R1[ 1, 2 ] R1 * B R1 %*% B # 成為一個矩陣 A <- matrix( 1:9, nrow = 3, ncol = 3 ) B <- matrix( 1:9, nrow = 3, ncol = 3, byrow = TRUE ) R2 <- A[ 1, , drop = FALSE ] class( R2 ) R2[ 1, 2 ] R2 %*% B # 形成另外一個矩陣或向量 A <- matrix( 1:9, nrow = 3, ncol = 3 ) E <- A[ c(1, 3), ] class( E ) E F <- A[ c(1, 3), 2 ] class( F ) F # 結合矩陣 C <- matrix( 1:4, nrow = 2, ncol = 2 ) D <- matrix( 1:6, nrow = 2, ncol = 3 ) cbind( C, D ) E <- matrix( 1:4, nrow = 2, ncol = 2 ) F <- matrix( 1:6, nrow = 3, ncol = 2 ) rbind(E, F) # 轉置矩陣 A <- matrix( 1:9, nrow = 3, ncol = 3 ) t( A ) t( A ) %*% A diag( A ) sum( diag( A ) ) # 矩陣的行列式值與反矩陣 A <- matrix( c(1, 0, 0, 3, 0.5, 0, 2, 1, 0.25), nrow = 3, ncol = 3 ) det(A) Ainv <- solve(A) Ainv Ainv %*% A A <- matrix( c(1, 0, 0, 3, 0.5, 0, 2, 1, 0.25), nrow = 3, ncol = 3 ) b <- c(2, 1, 3) solve( A, b ) A b # 陣列 – array 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 ) # 列表 camera <- list(c("Leica", "Pentax", "Olympus", "Nikon"), c(1.2, 3.4), c("red", "green", "blue")) camera camera <- list(brand = c("Leica", "Pentax", "Olympus", "Nikon"), real.number = c(1.2, 3.4), color = c("red", "green", "blue")) camera # 索引方式 1 – 使用 [ ] a1 <- camera[ 1 ] a1 camera[ "brand" ] class( a1 ) #索引方式 2 – 使用 [[ ]] a2 <- camera[[ 1 ]] a2 camera[[ "brand" ]] class( a2 ) # 索引方式 3 – 使用 $ a3 <- camera$brand a3 class( a3 ) # 索引方式 的比較 a1 # a1 是列表 a2 # a2 是向量 a3 # a3 是向量 class( a1 ) class( a2 ) class( a3 ) camera[ 1 ][ 1 ] a1[ 1 ] a2[ c(1, 2) ] a3[ 2 ] a1 a1[1] a1[1] a1[ 1 ] a1[ 1 ] a1[ 1 ]camera[ 1 ][ 1 ] a1[ 1 ] a2[ c(1, 2) ] a3[ 2 ] camera[ 1 ][ 1 ] a1[ 1 ] a2[ c(1, 2) ] a3[ 2 ] a1[ 1 ] a2[ c(1, 2) ] a3[ 2 ] a1 # a1 是列表 a2 # a2 是向量 a3 # a3 是向量 class( a1 ) class( a2 ) class( a3 ) camera[ 1 ][ 1 ] a1[ 1 ] a2[ c(1, 2) ] a3[ 2 ] # 資料框 x1 <- c("father", "mother", "brother", "sister") x2 <- c("Leica", "Pentax", "Olympus", "Nikon") x3 <- c("gold", "red", "green", "blue") x4 <- c(2, 1, 1, 2) camera <- data.frame(member = x1, brand = x2, color = x3, amount = x4) camera x1 x2 x3 x4 camera # 資料框 – 特徵 camera class(camera) names(camera) colnames(camera) # column names rownames(camera) # row names # 資料框 – 內容 camera camera$brand camera[, 2] camera[, "brand"] # 資料框 – 加入一行數據 x5 <- c(8, 3, 2, 2) camera$cost <- x5 camera # 資料框 – 改變名稱 test <- camera colnames(test)[c(4, 5)] <- c("number", "money") test # 資料框 – 捉取某一欄位的數據 # 品牌 (brand) 為 Leica 的資料 camera[ camera$brand == "Leica", ] subset( camera, brand == "Leica" ) # 品牌 (brand) 為 Leica 或 Nikon 的資料 camera[ camera$brand %in% c("Leica", "Nikon"), ] subset( camera, brand %in% c("Leica", "Nikon") ) # 價格 (cost) 大於 2 的資料 camera[ camera$cost > 2, ] subset( camera, cost > 2) # 資料框 – 把矩陣轉為資料框 A <- matrix( c(1, -5, 4, 3, 6, -2 ), nrow = 2, ncol = 3 ) rownames( A ) # row names colnames( A ) # column names D <- as.data.frame( A ) names( D ) colnames( D ) rownames( D ) D$V1 A D # 因子 x <- c("R", "G", "B", "R", "R", "B", "R", "G", "G") class( x ) y <- factor( x ) class( y ) # 這些等級可以用整數來表示 as.integer( y ) levels( y ) levels( y )[2] nlevels( y ) levels( y )[ as.integer(y) ] # 因子 – 5的等級,3個分量 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) )