Trong đa số các tập tin về dữ liệu, các dữ liệu số là một thành phần quan trọng. Khi xử lý, ta phải tính toán, thực hiện các thao tác trên loại dữ liệu này. Để đáp ứng yêu cầu trên, R cung cấp cho chúng ta một số lượng đáng kể các hàm. Trong phần này, ta sẽ tìm hiểu một số hàm quan trọng, thường dùng hơn cả.
Trong R ta có thể thực hiện các phép toán sau:
+
: phép cộng,-
: phép trừ,*
: phép nhân,/
: phép chia,^
hay **
: phép lũy thùa,%/%
: phép chia có kết quả (thương số) là số nguyên,%%
: phép lấy phần dư của phép chia có thương số là số nguyên.Lưu ý rằng trong hai phép toán cuối, các toán hạng không bắt buộc là số nguyên. Ta có thể viết 24.3 %/% 3.8
hay 24.3 %% 3.8
.
Bên cạnh đó, R cũng cung cấp cho chúng ta một số hàm để thực hiện các tính toán phức tạp hơn. R sắp xếp chúng vào một số nhóm sau:
sin(x)
, cos(x)
, tan(x)
là các hàm lượng giác cơ bản.asin(x)
, acos(x)
, atan(x)
, atan2(y, x)
là các hàm ngược của các hàm lượng giác cơ bản.sinh(x)
, cosh(x)
, tanh(x)
là các hàm hyperbol cơ bản.asinh(x)
, acosh(x)
, atanh(x)
, là các hàm ngược của các hàm hyperbol cơ bản.log(x, n)
và logb(x, n)
: logarit của số x với cơ số là n. Giá trị mặc định của cơ số là e (logarit tự nhiên),log10(x)
và log2(x)
: logarit của số x với cơ số lần lượt là 10 và 2,log1p(x)
: logarit của (1 + x) với cơ số là e,exp(x)
: là ex,expm1(x)
: là ex - 1,ceiling(x)
: kết quả là số nguyên lớn hơn x và gần x nhất :ceiling(5.65)
là 6 và ceiling(-5.65)
là -5 .floor(x)
: kết quả là số nguyên nhỏ hơn x và gần x nhất :floor(5.65)
là 5 và floor(-5.65)
là -6 .trunc(x)
: loại bỏ phần thập phân và giữ lại phần nguyên của x :trunc(5.65)
là 5 và trunc(-5.65)
là -5 .round(x, n)
: làm tròn số bằng cách chỉ giữ lại n số thập phân sau dấu phẩy và giá trị mặc định của n là 0 :round(5.12345, 3)
là 5,123 và round(5.12345)
là 5.round(123456, -2)
có kết quả là 123500.signif(x, m)
: làm tròn số bằng cách giữ lại m chữ số có nghĩa và giá trị mặc định của m là 6:signif(75.12345, 4)
là 75,12.abs(x)
: lấy giá trị tuyệt đối của x.factorial(x)
: tính giai thừa của x.sqrt(x)
: tính căn bậc hai của x.
Hầu hết các hàm và phép toán số học trong R đều có thể mở rộng để áp dụng cho các vectơ và trong một chừng mực nào đó là ma trận. Ta xét các thí dụ sau:
> (c(2, 5, 4, 8))**2
[1] 4 25 16 64
> log(1:5)
[1] 0.0000000 0.6931472 1.0986123 1.3862944 1.6094379
Nếu đó là phép toán giữa một số và một vectơ thì phép toán ấy được thực hiện giữa số này và tất cả các phần tử của vectơ như thí dụ sau:
> 3*seq(2, 10, 2)
[1] 6 12 18 24 30
Nếu đây là phép toán giữa hai vec tơ cùng cỡ a và b thì kết quả là một vectơ x cùng cỡ với a và b. Phần tử thứ `i` của x thu được bằng cách thực hiện phép toán giữa phần tử thứ `i` của vectơ thứ nhất và phần tử thứ `i` của vectơ thứ hai (nguyên tắc phần tử đối ứng). Ta xét các thí dụ sau:
> a <- 5:8
> b <- c(2, 3, 5, 4)
> a + b
[1] 7 9 12 12
> a^b
[1] 25 216 16807 4096
Nếu hai vectơ không cùng cỡ thì R sẽ tự động lấy các phần tử của vectơ có cỡ bé hơn để thêm vào vectơ này theo quy tắc lặp vòng (Recycling Rule). Nếu số phần tử của hai vectơ này không chia chẵn cho nhau, R sẽ đưa ra cảnh báo. Thí dụ:
> a <- c(2, 4, 8, 5, 3)
> b <- 1:8
> a + b
[1] 3 6 11 9 8 8 11 16
Warning message:
In a + b : longer object length is not a multiple of shorter object length
Ta thấy R đã lấy 3 phần tử đầu tiên của a là 2, 4 và 8 để thêm vào phía sau của a để vectơ này cũng có 8 phần tử như b trước khi thực hiện phép cộng.
Đối với các phần tử của một vectơ, R có hai hàm thông dụng là sum
để tính tổng các phần tử và prod
để tính tích các phần tử. Thí dụ:
> sum(5:50)
[1] 1265
> prod(seq(2, 20, 2))
[1] 3715891200
Đối với hai vectơ, ta có thể sử dụng các phép tính số học được mở rộng như đã trình bày ở phần trên. Để tính tích vô hướng, ta có thể sử dụng phép toán %*%
như thí dụ sau:
> a <- c(2, 5, 8, 4, 6)
> b <- -2:2
> a %*% b
[,1]
[1,] 7
Tuy nhiên, ta nhận xét rằng kết quả là một ma trận có một dòng một cột, không phải là số vô hướng (scalar). Đó là do %*%
là phép nhân ma trận. Ta có thể dùng hàm as.numeric
để chuyển đổi ma trận này. Kết quả như sau:
> as.numeric(a %*% b)
[1] 7
Ta có thể so sánh được sự khác biệt trong hai trường hợp trên. Tuy vậy ta có thể thu được kết quả tương tự với cú pháp đơn giản hơn như sau:
> sum(a*b)
[1] 7
Đối với các phần tử của một vectơ, ta còn có thể thực hiện một số tính toàn thống kê như tìm trị trung bình, phương sai. Những nội dung này sẽ được đề cập đến ở phần Thống kê mô tả.
Cũng như trường hợp vectơ, ta có thể mở rộng các phép toán thông thường để thực hiện các phép cộng +
, trừ -
, nhân *
, chia /
giữa một số và một ma trận cũng như giữa hai ma trận với nhau theo nguyên tắc phần tử đối ứng.
Ta cũng có thể nhân hai ma trận bằng phép toán %*%
như thí dụ sau:
> A <- matrix(2:9, 2)
> B <- matrix(1:12, 4)
> A %*% B
[,1] [,2] [,3]
[1,] 60 140 220
[2,] 70 166 262
Ngoài ra, R cũng cung cấp cho chúng ta một số hàm sau để thực hiện các tính toán ma trận cơ bản:
t(A)
: tính chuyển vị của A.det(A)
: tính định thức của ma trận A.solve(A)
: tính ma trận đảo của A.solve(A, b)
: giải phương trình Ax = b để tìm vectơ x (x = A- 1b).eigen(A)
: tìm trị số riêng và vectơ riêng của ma trận vuông A. Kết quả yy
của hàm này là một danh sách hai phần tử, phần tử thứ nhất yy$val
là các trị số riêng của A, yy$vec
là các vectơ riêng của A.colMeans(A)
, rowMeans(A)
, colSums(A)
, rowSums(A)
là các vectơ chứa trung bình các cột, trung bình các dòng, tổng các phần tử của cột, tổng các phần tử của dòng của A (theo thứ tự)diag(doi_so)
có kết quả tùy thuộc đối số :
Trong đối số của các hàm trên, A, B là các ma trận ; a, b, x là các vectơ.
Ngoài ra, R còn có phụ kiện Matrix để hỗ trợ chúng ta trong các tính toán hay khảo sát phức tạp về ma trận.
Trang web này được cập nhật lần cuối ngày 25/11/2018
R
Các chuyên đề
Xử lý dữ liệu
Ma trận
R