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.

  • 🧩 Kết cấu: Ma trận là một vectơ có thuộc tính chiều, vì vậy mỗi ô phải có cùng một kiểu dữ liệu.
  • 🛠️ Sự sáng tạo: Hàm matrix(data, nrow, ncol, byrow) sắp xếp một chuỗi, và R suy ra chiều còn thiếu.
  • 🔄 Hoàn thành đơn hàng: byrow = FALSE điền dữ liệu theo cột, trong khi byrow = TRUE điền dữ liệu theo hàng.
  • Sự phát triển: Hàm cbind() nối thêm các cột và hàm rbind() nối thêm các hàng, với điều kiện chiều chung trùng khớp.
  • Cắt lát: m[row, column] đọc các hàng trước, và một cạnh trống sẽ chọn tất cả mọi thứ trên cạnh đó.
  • 🏷️ Nhãn: dimnames, rownames() và colnames() thay thế các ký tự giữ chỗ [,1] bằng các tên dễ đọc hơn.
  • ➕➖ Môn số học: Dấu hoa thị nhân từng phần tử một, trong khi %*% thực hiện phép nhân ma trận.

Hàm ma trận trong R: Tạo, in, thêm cột và cắt lát.

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 bố trí hàng và cột của một hàm ma trận trong R.

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.

Kết quả hiển thị trên console của ma trận matrix_a được điền từng hàng một với tham số byrow = TRUE.

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:

Kết quả hiển thị trên console của ma trận_b được điền từng cột một với tham số byrow = FALSE

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

Kết quả hiển thị trên bảng điều khiển của bốn biểu thức cắt ma trận trong R.

Đặ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.

Câu Hỏi Thường Gặp

R tái sử dụng các giá trị thay vì loại bỏ chúng, vì vậy matrix(1:3, nrow = 2, ncol = 3) lặp lại chuỗi. Cảnh báo chỉ xuất hiện khi độ dài không phải là bội số chính xác của số ô, điều này khiến việc tái sử dụng ngầm trở thành một lỗi dễ bị bỏ sót.

Sử dụng chỉ số âm: m[-2, ] loại bỏ hàng thứ hai và m[, -3] loại bỏ cột thứ ba. Có thể loại bỏ nhiều hàng cùng một lúc với m[-c(1, 4), ]. Đối tượng ban đầu không thay đổi cho đến khi bạn gán lại kết quả.

Việc chọn một hàng hoặc cột duy nhất sẽ loại bỏ chiều trống theo mặc định. Thêm drop = FALSE, như trong m[1, , drop = FALSE], để giữ lại ma trận một hàng. Điều này rất quan trọng khi kết quả được truyền cho một hàm mong đợi hai chiều.

Hàm `which(m == value, arr.ind = TRUE)` trả về kết quả gồm hai cột, cho biết hàng và cột của mỗi kết quả khớp. Nếu không có `arr.ind`, câu trả lời sẽ là một chỉ số tuyến tính duy nhất được đếm xuống các cột, điều này hiếm khi là điều bạn muốn.

Sử dụng mảng(dữ liệu, dim = c(hàng, cột, lớp)) hoặc gán trực tiếp dim(x) cho một vectơ. Khi đó, việc cắt lát sẽ lấy một chỉ số cho mỗi chiều, chẳng hạn như a[2, 3, 1]. Ma trận chỉ đơn giản là trường hợp hai chiều của một mảng.

Đúng vậy. Tài liệu tham khảo cơ bản của R cho biết rằng rowSums và colMeans tương đương với apply() với sum hoặc mean nhưng nhanh hơn nhiều, và cả hai đều hiệu quả hơn vòng lặp for tường minh vì quá trình lặp diễn ra trong mã đã biên dịch chứ không phải trong trình thông dịch.

Việc khớp mô hình là đại số tuyến tính: các đặc trưng tạo thành một ma trận, các hệ số tạo thành một vectơ, và dự đoán là một tích %*% duy nhất. Nhiều học máy Do đó, các gói này yêu cầu ma trận số thay vì khung dữ liệu làm đầu vào.

Vâng. Trợ lý GitHub Chương trình chạy trên RStudio 2023.09.0 trở lên và tự động hoàn thành mã từ các chú thích trong tệp đang mở. Hãy kiểm tra logic về kích thước của nó trong... RStudioVì một hàng sai vẫn tạo ra một ma trận hợp lệ.

Tóm tắt bài viết này với: