Hàm ma trận trong R: Tạo, In, thêm Cột & Cắt
⚡ Tóm tắt thông minh
Ma trận trong R là một mảng hai chiều chứa một kiểu dữ liệu duy nhất trải rộng trên m hàng và n cột, được xây dựng bằng hàm matrix(), mở rộng bằng các hàm cbind() và rbind(), và truy cập thông qua dấu ngoặc vuông.
Hàm ma trận trong R
Hàm ma trận trong R là một mảng 2 chiều có m số hàng và n số cột. Nói cách khác, ma trận trong lập trình R là sự kết hợp của hai hoặc nhiều vectơ có cùng kiểu dữ liệu.
Về bản chất, ma trận chỉ đơn giản là một vectơ mang thuộc tính `dim` có độ dài hai. Đó là lý do tại sao mỗi phần tử phải có cùng một kiểu dữ liệu: ngay khi một giá trị ký tự được kết hợp với các số, toàn bộ ma trận sẽ được chuyển đổi thành ký tự. R lưu trữ các giá trị trong một hàng duy nhất và sử dụng `dim` để quyết định vị trí kết thúc của mỗi hàng, vì vậy việc lựa chọn... loại dữ liệu Áp dụng cho toàn bộ đối tượng cùng một lúc.
Lưu ý: Bản thân hàm matrix() luôn trả về chính xác hai chiều. Để xây dựng cấu trúc có ba chiều trở lên trong R, hãy sử dụng hàm array() với một vectơ dim, hoặc gán trực tiếp cho dim(). Sơ đồ bên dưới cho thấy bố cục hàng và cột mà mọi ma trận đều tuân theo.
Cách tạo ma trận trong R
Chúng ta có thể tạo một ma trận bằng hàm số đó. ma trận ()Hàm cơ bản trong R nhận năm tham số, và ba tham số được sử dụng thường xuyên nhất được hiển thị ở đây:
matrix(data, nrow, ncol, byrow = FALSE)
đối số:
- dữ liệu: Tập hợp các phần tử mà R sẽ sắp xếp thành các hàng và cột của ma trận.
- thu hẹp lạiSố hàng.
- ncolSố cột.
- đi ngang qua: Một cờ logic. Với giá trị mặc định byrow = FALSE, ma trận được điền theo cột, từ trên xuống dưới. Với byrow = TRUE, ma trận được điền theo hàng, từ trái sang phải.
- tên chiều: Một danh sách tùy chọn có độ dài hai phần tử, cung cấp tên hàng và tên cột.
Trước ví dụ đầu tiên, có hai chi tiết từ tài liệu tham khảo cơ bản của R mà bạn nên biết. Nếu chỉ một trong hai tham số nrow và ncol được cung cấp, R sẽ suy ra tham số còn lại từ độ dài của dữ liệu. Và nếu dữ liệu có quá ít phần tử để lấp đầy hình dạng bạn yêu cầu, các giá trị sẽ được tái sử dụng thay vì bị loại bỏ.
Chúng ta hãy xây dựng hai ma trận 5×2 từ dãy số từ 1 đến 10, một ma trận với byrow = TRUE và một ma trận với byrow = FALSE, để thấy sự khác biệt.
# Construct a matrix with 5 rows that contain the numbers 1 up to 10 and byrow = TRUE matrix_a <-matrix(1:10, byrow = TRUE, nrow = 5) matrix_a
Đầu ra:
Vì tham số byrow = TRUE được sử dụng, nên bảng điều khiển sẽ điền hàng đầu tiên với số 1 và 2, hàng thứ hai với số 3 và 4, v.v.
In ra kích thước của ma trận a bằng hàm dim().
Bây giờ, hãy in kích thước của ma trận trong R bằng dim(). Cú pháp in ma trận trong R bằng dim() là:
# Print dimension of the matrix with dim()
dim(matrix_a)
Đầu ra:
## [1] 5 2
Hàm dim() trả về số hàng trước rồi đến số cột sau, xác nhận hình dạng 5×2.
Điền ma trận theo cột với tham số byrow = FALSE
Cùng mười con số và cùng một hàng sẽ tạo ra cách sắp xếp khác nhau khi hướng điền thay đổi. Giữping Theo mặc định, hàm `byrow` sẽ gửi các giá trị xuống cột đầu tiên trước khi cột thứ hai bắt đầu.
# Construct a matrix with 5 rows that contain the numbers 1 up to 10 and byrow = FALSE matrix_b <-matrix(1:10, byrow = FALSE, nrow = 5) matrix_b
Đầu ra:
In ra kích thước của ma trận b bằng hàm dim().
Một lần nữa, in kích thước của ma trận bằng dim(). Dưới đây là cú pháp của kích thước ma trận in R:
# Print dimension of the matrix with dim()
dim(matrix_b)
Đầu ra:
## [1] 5 2
Hình dạng không thay đổi ở kích thước 5×2, vì việc sắp xếp theo hàng chỉ thay đổi thứ tự điền chứ không thay đổi kích thước tổng thể.
Lưu ý: Việc sử dụng lệnh matrix_b <-matrix(1:10, byrow = FALSE, ncol = 2) sẽ có tác dụng tương tự như trên, vì R suy ra nrow = 5 từ mười giá trị được cung cấp.
Bạn cũng có thể tạo ma trận 4×3 bằng lệnh ncol. R sẽ tạo 3 cột và điền dữ liệu vào mỗi cột từ trên xuống dưới. Hãy xem ví dụ.
matrix_c <-matrix(1:12, byrow = FALSE, ncol = 3)
matrix_c
Đầu ra:
## [,1] [,2] [,3] ## [1,] 1 5 9 ## [2,] 2 6 10 ## [3,] 3 7 11 ## [4,] 4 8 12
Các tiêu đề cột [,1] đến [,3] và nhãn hàng [1,] đến [4,] là các phần giữ chỗ mặc định của R. Chúng sẽ biến mất ngay khi tên chiều thực được cung cấp, như được trình bày sau trong hướng dẫn này.
Ví dụ:
dim(matrix_c)
Đầu ra:
## [1] 4 3
Thêm cột vào ma trận bằng cbind()
Bạn có thể thêm cột vào ma trận R bằng lệnh cbind(). cbind() có nghĩa là liên kết cột, và nó có thể nối nhiều ma trận hoặc cột như đã chỉ định. Ví dụ, ví dụ trước của chúng ta đã tạo ra một ma trận 5×2. Chúng ta nối thêm một cột thứ ba và kiểm tra xem kích thước có phải là 5×3 hay không.
Ví dụ:
# concatenate c(1:5) to the matrix_a matrix_a1 <- cbind(matrix_a, c(1:5)) # Check the dimension dim(matrix_a1)
Đầu ra:
## [1] 5 3
Ví dụ:
matrix_a1
Đầu ra
## [,1] [,2] [,3] ## [1,] 1 2 1 ## [2,] 3 4 2 ## [3,] 5 6 3 ## [4,] 7 8 4 ## [5,] 9 10 5
Ví dụ:
Chúng ta cũng có thể liên kết nhiều cột cùng một lúc. Khối lệnh tiếp theo xây dựng ma trận matrix_a2, một ma trận 4×3 chứa các số từ 13 đến 24, để nó có thể được kết hợp với ma trận 4×3 matrix_c nhằm tạo ra kết quả 4×6 bao gồm các số từ 1 đến 24.
matrix_a2 <-matrix(13:24, byrow = FALSE, ncol = 3)
Đầu ra:
## [,1] [,2] [,3] ## [1,] 13 17 21 ## [2,] 14 18 22 ## [3,] 15 19 23 ## [4,] 16 20 24
Ví dụ:
matrix_c <-matrix(1:12, byrow = FALSE, ncol = 3)
matrix_d <- cbind(matrix_a2, matrix_c)
dim(matrix_d)
Đầu ra:
## [1] 4 6
LƯU ÝSố hàng của các ma trận trong R phải bằng nhau để hàm cbind() hoạt động. Khi chúng khác nhau, R sẽ sử dụng lại ma trận có số hàng ít hơn hoặc báo lỗi, vì vậy việc kiểm tra dim() trên cả hai đối tượng trước tiên là cách an toàn hơn.
Trong khi hàm cbind() nối các cột, hàm rbind() thêm các hàng. Hãy thêm một hàng vào ma trận matrix_c của chúng ta và kiểm tra xem kích thước có phải là 5×3 hay không.
matrix_c <-matrix(1:12, byrow = FALSE, ncol = 3) # Create a vector of 3 columns add_row <- c(1:3) # Append to the matrix matrix_c <- rbind(matrix_c, add_row) # Check the dimension dim(matrix_c)
Đầu ra:
## [1] 5 3
Lưu ý rằng việc liên kết một vectơ có tên như add_row cũng gán tên đó cho hàng mới, đây là bước đầu tiên hướng tới các ma trận có nhãn được đề cập ở phần sau.
Cắt một ma trận
Chúng ta có thể chọn một hoặc nhiều phần tử từ một ma trận. Lập trình R bằng cách sử dụng dấu ngoặc vuông [ ]. Bên trong dấu ngoặc vuông, bộ chọn hàng đứng trước và bộ chọn cột đứng sau, được phân cách bởi dấu phẩy. Đây là nơi mà việc cắt lát phát huy tác dụng.
Ví dụ:
- Matrix_c[1,2] chọn phần tử ở hàng đầu tiên và cột thứ hai.
- matrix_c[1:3,2:3] trả về một ma trận lát cắt R với dữ liệu trên các hàng 1, 2, 3 và các cột 2 và 3.
- Matrix_c[,1] chọn tất cả các phần tử của cột đầu tiên.
- Matrix_c[1,] chọn tất cả các phần tử của hàng đầu tiên.
Để trống một bên của dấu phẩy có nghĩa là mọi giá trị ở phía đó đều trống. Một hệ quả thường khiến người mới bắt đầu bối rối: khi chọn một hàng hoặc cột duy nhất, R sẽ loại bỏ chiều trống và trả về một vectơ thông thường. Thêm drop = FALSE, như trong matrix_c[1, , drop = FALSE], sẽ giữ cho kết quả là một ma trận.
Đây là kết quả bạn nhận được cho các mã trên
Đặt tên cho các hàng và cột của ma trận trong R.
Các nhãn mặc định như [,1] và [3,] khiến cho kết quả khó đọc ngay khi ma trận mang ý nghĩa thực sự. Tham số dimnames và các hàm thay thế rownames() và colnames() gắn các nhãn văn bản, sau đó các nhãn này sẽ đi kèm với ma trận thông qua cbind(), t() và mọi thao tác cắt lát.
# Name the rows and columns while the matrix is built sales <- matrix(1:6, nrow = 2, ncol = 3, dimnames = list(c('north', 'south'), c('q1', 'q2', 'q3'))) # Or attach the names afterwards rownames(sales) <- c('north', 'south') colnames(sales) <- c('q1', 'q2', 'q3') # Read the names back as a list of two character vectors dimnames(sales) # Names make label based slicing possible sales['north', 'q2']
| Chức năng | Đọc | bộ |
|---|---|---|
| dimnames(m) | Cả hai chiều đều được xem như một danh sách gồm hai vectơ. | dimnames(m) <- list(rows, cols) |
| tên hàng (m) | Nhãn hàng | tên hàng (m) <- hàng |
| colnames(m) | Nhãn cột | colnames(m) <- cols |
| dim(m) | Hàng và cột được biểu diễn dưới dạng hai số nguyên. | dim(m) <- c(nrow, ncol) |
Khi các nhãn đã tồn tại, sales['north', 'q2'] rõ ràng hơn nhiều so với sales[1, 2] và vẫn giữ nguyên sau khi sắp xếp lại các hàng. Việc đặt thành phần dimnames thành NULL sẽ loại bỏ tập hợp các nhãn đó một lần nữa, và ma trận được chuyển đổi bằng as.data.frame() sẽ giữ nguyên tên hàng và cột của nó. khung dữ liệu.
Matrix OperaCác phép toán trong R: Số học, Chuyển vị và Nhân
Phép toán số học trên ma trận là nơi mà quy tắc kiểu dữ liệu duy nhất phát huy tác dụng. Ngôn ngữ lập trình R cơ bản xử lý toàn bộ tập hợp các phép toán này mà không cần thêm gói nào, nhưng có hai toán tử dễ gây nhầm lẫn: * nhân từng phần tử với nhau, trong khi %*% thực hiện phép nhân ma trận thực sự và yêu cầu các cột của toán hạng bên trái phải khớp với các hàng của toán hạng bên phải.
m1 <- matrix(1:4, nrow = 2) m2 <- matrix(5:8, nrow = 2) m1 + m2 # element by element addition m1 * m2 # element by element product, NOT matrix multiplication m1 %*% m2 # true matrix multiplication t(m1) # transpose: rows become columns solve(m1) # inverse, for a square matrix that is not singular rowSums(m1) # one total per row colMeans(m1) # one mean per column apply(m1, 1, max) # any function, applied row by row
- t(m): Chuyển vị ma trận, sao cho phần tử [i, j] trở thành [j, i]. Tên chiều được giữ nguyên.
- giải (m): Trả về ma trận nghịch đảo của một ma trận vuông, không suy biến, và solve(a, b) giải một hệ phương trình tuyến tính.
- Tổng hàng / Tổng cột / Trung bình hàng / Trung bình cột: Được ghi nhận là tương đương với hàm apply() khi sử dụng sum hoặc mean, nhưng nhanh hơn rất nhiều.
- áp dụng(m, MARGIN, FUN): MARGIN = 1 duyệt qua các hàng và MARGIN = 2 duyệt qua các cột, đối với bất kỳ hàm nào bạn cung cấp.
- chẩn đoán, xác định, sản phẩm chéo: Đường chéo, định thức và dạng nhanh hơn của t(x) %*% y.
Vì các thao tác này được vector hóa, chúng thay thế các vòng lặp thay vì nằm bên trong chúng. Một phép tính tóm tắt mà trước đây cần một vòng lặp for lồng nhau trên hàng nghìn ô sẽ trở thành một lệnh gọi colMeans() duy nhất, điều này rất quan trọng khi dữ liệu tăng lên.
Ma trận so với Khung dữ liệu so với Mảng trong R
Ma trận, khung dữ liệu và mảng đều trông có dạng hình chữ nhật trong bảng điều khiển, nhưng chúng lại trả lời những câu hỏi khác nhau. Bảng này đặt chúng cạnh nhau.
| Bất động sản | Matrix | Khung dữ liệu | Mảng |
|---|---|---|---|
| Kích thước | Chính xác là 2 | Chính xác là 2 | Bất kỳ số nào |
| Loại cột | Một kiểu dữ liệu duy nhất cho toàn bộ đối tượng. | Mỗi cột một kiểu dữ liệu khác nhau. | Một kiểu dữ liệu duy nhất cho toàn bộ đối tượng. |
| Được xây dựng với | ma trận () | data.frame() | mảng() |
| Sử dụng điển hình | Tính toán số học và đại số tuyến tính | Dữ liệu quan sát hỗn hợp | Bảng xếp chồng, chẳng hạn như số liệu theo năm. |
| Nhãn hàng | Tên chiều tùy chọn | Tên hàng luôn hiện diện | Tên chiều tùy chọn |
# A matrix holds one type only, so mixing coerces everything to character mixed <- matrix(c(1, 2, 'a', 'b'), nrow = 2) class(mixed[1, 1]) # Convert between the structures as.data.frame(matrix_c) as.matrix(mtcars) # A matrix is the two dimensional case of an array is.matrix(matrix_c) inherits(matrix_c, 'array')
Hãy sử dụng ma trận khi mỗi ô đều chứa cùng một loại số và phép toán là phép toán số học. Hãy sử dụng... khung dữ liệu khi các cột chứa các kiểu dữ liệu khác nhau, ví dụ như tên ký tự bên cạnh giá số và một... yếu tốHãy với lấy một Khi các phần có độ dài khác nhau, và đối với mảng thì chỉ số thứ ba như thời gian hoặc khu vực thực sự tồn tại. Việc chuyển đổi theo cả hai hướng đều tiết kiệm chi phí với as.matrix() và as.data.frame(), vì vậy cấu trúc có thể tuân theo nhiệm vụ chứ không phải ngược lại.





