“Muốn biết phải hỏi, muốn giỏi phải học.”
Tục ngữ

Dùng R để tính toán cơ bản

Phép toán số học trong R
Phép toán Ký hiệu trong R
Cộng +
Trừ -
Nhân *
Chia /
Nâng lũy thừa ^, **
Chia lấy phần dư %%
Chia lấy phần nguyên %/%

Thứ tự ưu tiên phép toán từ trái sang phải: () \(\rightarrow\) ^ \(\rightarrow\) * \(\rightarrow\) / \(\rightarrow\) + \(\rightarrow\) -.

2+3
## [1] 5
14/6
## [1] 2.333333
14/6+5
## [1] 7.333333
14/(6+5)
## [1] 1.272727
3^2
## [1] 9
-2^2
## [1] -4
(-2)^2
## [1] 4
(2+3)^2*3/5+1
## [1] 16

Ví dụ: Hãy tính các biểu thức sau bằng R

  1. \(10^2+\frac{30\times 60}{8}-3\)
  2. \(\frac{5^3(6^4-2)}{61^2-13^2-4}\)
  3. \(2^{2.1+1}-4+64^{{-2}^{2.25-\frac{1}{4}}}\)
  4. \(\Big(\frac{0.44(1-0.44)}{34}\Big)^{\frac{1}{2}}\)

Căn bậc hai, logarit và hàm mũ

sqrt(9)
## [1] 3
sqrt(5.311)
## [1] 2.304561
log(243) # mặc định là cơ số e
## [1] 5.493061
log(243, base = 3) # log cơ số 3
## [1] 5
exp(3)
## [1] 20.08554
log(243, base = exp(1))
## [1] 5.493061
log(243)
## [1] 5.493061

Ký hiệu e trong R.

1e3
## [1] 1000
5e4
## [1] 50000
2e-3
## [1] 0.002
100000000000
## [1] 1e+11
500000000000
## [1] 5e+11
0.00000000032
## [1] 3.2e-10

Bài tập 2.1

  1. Cho \(a=2.3\), dùng R để xác minh rằng \[\frac{6a+42}{3^{4.2-3.62}}=29.50556\]
  2. Biểu thức nào sau đây là bình phương của trừ 4 và cộng 2?
    1. \((-4)^2+2\)
    2. \(-4^2+2\)
    3. \((-4)^{(2+2)}\)
    4. \(-4^{(2+2)}\)
  3. Dùng R để tính căn bậc hai của một nửa của trung bình cộng số học các số 25.2, 15, 16.44, 15.3 và 18.6.
  4. Dùng R để tìm \(\log_e0.3\).
  5. Dùng R để tính hàm mũ của kết quả câu (d).

Gán đối tượng

Việc gán các đối tượng/kết quả trong R với một cái tên cụ thể sẽ giúp ít cho việc gọi lại các đối tượng đó trong các tính toán tiếp theo. Để gán một đối tượng nào đó trong R với một cái tên cho trước chúng ta dùng dấu <- hoặc dấu =.

x <- -5
x
## [1] -5
y = 10
y
## [1] 10
a <- (2+3)^2*3/5+1
a
## [1] 16
sqrt(a)
## [1] 4
# (overwrite) ghi đè
a = a + 10
a
## [1] 26
(a^2-3*a-8)/10 -> b
b
## [1] 59
# liệt kê tất cả các đối đượng đang có trong workspace
ls()
## [1] "a" "b" "x" "y"

Lưu ý: Khi đặt tên đối tượng trong R cần chú ý một số điều sau:

Bài tập 2.2

  1. Tạo một đối tượng để lưu giá trị \(3^2\times 4^{\frac{1}{8}}\)
  2. Ghi đè đối tượng ở câu (a) bằng cách lấy chính nó chia cho 2.33.
  3. Tạo một đối tượng mới với giá trị là \(-8.2\times 10^{-13}\)
  4. Nhân hai kết quả ở câu (b) và (c).

Tạo vectơ

Vectơ là một cấu trúc dữ liệu cơ bản trong R. Nó chứa các phần tử cùng kiểu. Các kiểu dữ liệu có thể là logic (TRUE, FALSE), số nguyên (0L, 3L, 10L), số thực (3, 5.15, 0.32, 100), ký tự (small, medium, large) hoặc số phức (1+2i, 3i, 2+i). Để tạo vectơ trong R chúng ta dùng hàm c().

myvec1 <- c(1, 3, 1, 42)
myvec1
## [1]  1  3  1 42
myvec2 <- c(3, -3, 2, 3.45, 1e+03, 64^0.5, 2+(3-1.1)/9.44)
myvec2
## [1]    3.000000   -3.000000    2.000000    3.450000 1000.000000    8.000000
## [7]    2.201271
myvec3 <- c(myvec1, myvec2)
print(myvec3)
##  [1]    1.000000    3.000000    1.000000   42.000000    3.000000   -3.000000
##  [7]    2.000000    3.450000 1000.000000    8.000000    2.201271

Để tạo ra dãy số (vectơ) cách đều nhau 1 đơn vị chúng ta có thể dùng dấu :.

x <- 1:10
x
##  [1]  1  2  3  4  5  6  7  8  9 10
y <- 10:1
y
##  [1] 10  9  8  7  6  5  4  3  2  1
(z <- 1:10*2)
##  [1]  2  4  6  8 10 12 14 16 18 20

Sau đây là một số hàm liên quan đến vectơ:

seq(from = 3, to = 27, by = 3)
## [1]  3  6  9 12 15 18 21 24 27
seq(from = 3, to = 27, length.out = 40)
##  [1]  3.000000  3.615385  4.230769  4.846154  5.461538  6.076923  6.692308
##  [8]  7.307692  7.923077  8.538462  9.153846  9.769231 10.384615 11.000000
## [15] 11.615385 12.230769 12.846154 13.461538 14.076923 14.692308 15.307692
## [22] 15.923077 16.538462 17.153846 17.769231 18.384615 19.000000 19.615385
## [29] 20.230769 20.846154 21.461538 22.076923 22.692308 23.307692 23.923077
## [36] 24.538462 25.153846 25.769231 26.384615 27.000000
seq(20, 4, by = -1)
##  [1] 20 19 18 17 16 15 14 13 12 11 10  9  8  7  6  5  4
seq(20, 4, length.out = 5)
## [1] 20 16 12  8  4
rep(1, times = 4)
## [1] 1 1 1 1
rep(c(3, 62, 8), times = 3)
## [1]  3 62  8  3 62  8  3 62  8
rep(c(3, 62, 8), each = 2)
## [1]  3  3 62 62  8  8
rep(c(3, 62, 8), times = 3, each = 2)
##  [1]  3  3 62 62  8  8  3  3 62 62  8  8  3  3 62 62  8  8
c(3, 8.3, rep(32, times = 4), seq(from = -2, to = 1, length.out = 5))
##  [1]  3.00  8.30 32.00 32.00 32.00 32.00 -2.00 -1.25 -0.50  0.25  1.00
sort(c(2.5, -1, -10, 3.44), decreasing = FALSE) # sắp tăng dần
## [1] -10.00  -1.00   2.50   3.44
sort(c(2.5, -1, -10, 3.44), decreasing = TRUE) # sắp giảm dần
## [1]   3.44   2.50  -1.00 -10.00
(my_vec <- seq(from=4.3,to=5.5,length.out=8))
## [1] 4.300000 4.471429 4.642857 4.814286 4.985714 5.157143 5.328571 5.500000
sort(my_vec, decreasing = T) # sắp giảm dần
## [1] 5.500000 5.328571 5.157143 4.985714 4.814286 4.642857 4.471429 4.300000
length(my_vec)
## [1] 8

Bài tập 2.3

  1. Tạo và đặt tên một dãy các giá trị cách nhau 0.3 trong khoảng từ 5 đến -11.
  2. Ghi đè đối tượng ở trên bằng cách sắp các giá trị của nó theo thứ tự ngược lại.
  3. Lặp lại vectơ c(-1, 3, -5, 7, -9) hai lần, trong đó mỗi thành phần lặp lại 10 lần và đặt tên cho đối tượng đó. Sắp xếp các giá trị của đối tượng vừa tạo từ lớn đến bé.
  4. Tạo và đặt tên một vectơ có chứa:
    1. Một dãy số nguyên từ 6 đến 12.
    2. Ba lần lặp lại giá trị 5.3
    3. Số -3
    4. Một dãy gồm 9 giá trị bắt đầu từ 102 và kết thúc tại giá trị là độ dài của vectơ tạo ở câu (c).
  5. Xác minh rằng độ dài của vectơ ở câu (d) là 20.

Trích xuất thành phần của vectơ

Chúng ta có thể sử dụng chỉ số chỉ vị trí của các giá trị của một vectơ để trích xuất phần tử và tập con của nó.

my.vec <- c(5,-2.3,4,4,4,6,8,10,40221,-8)
my.vec[1]
## [1] 5
my.vec[2]
## [1] -2.3
my.vec[length(my.vec)]
## [1] -8
my.vec[-1]
## [1]    -2.3     4.0     4.0     4.0     6.0     8.0    10.0 40221.0    -8.0
my.vec[-2]
## [1]     5     4     4     4     6     8    10 40221    -8
my.vec[c(1,3,5)]
## [1] 5 4 4

Chúng ta có thể thay thế một hay nhiều giá trị của vectơ nào đó.

bar <- c(3,2,4,4,1,2,4,1,0,0,5)
bar
##  [1] 3 2 4 4 1 2 4 1 0 0 5
bar[1] <- 100
bar
##  [1] 100   2   4   4   1   2   4   1   0   0   5
bar[c(2,4,6)] <- c(200, 300, 400)
bar
##  [1] 100 200   4 300   1 400   4   1   0   0   5
bar[7:10] <- 100
bar
##  [1] 100 200   4 300   1 400 100 100 100 100   5

Bài tập 2.4

  1. Tạo và đặt tên một vectơ có chứa:
    • Một dãy gồm 5 số từ 3 đến 6.
    • Vectơ c(2, −5.1, −33) lặp lại 2 lần.
    • Giá trị \(\frac{7}{42}+2\).
  2. Trích phần tử đầu và cuối của vectơ ở câu (1) và đặt tên thành một đối tượng mới.
  3. Tạo và đặt tên một vectơ mới bằng cách bỏ phần tử đầu và cuối của vectơ ở câu (1).
  4. Tạo lại vectơ ở câu (1) bằng cách chỉ sử dụng hai vectơ ở câu (2) và (3).
  5. Ghi đè vectơ ở câu (1) bằng cách sắp xếp thứ tự các giá trị của nó từ nhỏ đến lớn.
  6. Đảo ngược thứ tự các giá trị của vectơ câu (5) bằng cách dùng dấu : trong phần chỉ vị trí. Việc làm này cho cùng kết quả với viêc dùng hàm sort( , decreasing = F).
  7. Tạo một vectơ bằng cách lặp lại thành phần thứ ba của (3) ba lần, thành phần thứ 6 bốn lần và thành phần cuối một lần.
  8. Tạo một vectơ mới bằng cách sao chép (5) với tên mới. Thay thế các thành phần thứ 1 thứ 5-7 và thành phần cuối cùng của vectơ mới này bằng các giá trị từ 99 đến 95 tương ứng.

Tính toán trên vectơ

Trên R chúng ta có thể cộng, trừ, nhân, chia, nâng lũy thừa vectơ.

(x <- c(1, 3, 5, 7))
## [1] 1 3 5 7
(y <- c(2, 4, 6, 8))
## [1] 2 4 6 8
x + y
## [1]  3  7 11 15
x - y
## [1] -1 -1 -1 -1
x*y
## [1]  2 12 30 56
x/y
## [1] 0.5000000 0.7500000 0.8333333 0.8750000
x^2
## [1]  1  9 25 49

R cho phép tính toán trên hai vectơ không cùng độ dài bằng cách xoay vòng thành phần của vectơ ngắn hơn.

x + 3
## [1]  4  6  8 10
z <- c(2, 2)
x + z
## [1] 3 5 7 9
x*z
## [1]  2  6 10 14
x/10
## [1] 0.1 0.3 0.5 0.7

Chúng ta có thể tính tổng và tích các thành phần của vectơ bằng cách dùng hàm sum() (summation) và prod() (product) tương ứng.

sum(x)
## [1] 16
prod(x)
## [1] 105

Để tính hoán vị và tổ hợp chúng ta dùng hàm factorial()choose() tương ứng.

factorial(4)
## [1] 24
choose(5,2)
## [1] 10

Chúng ta cũng có thể áp dụng hoán vị và tổ hợp trên vectơ. R sẽ tính trên từng thành phần của vectơ.

(y <- c(2,4,6,8))
## [1] 2 4 6 8
factorial(y)
## [1]     2    24   720 40320
choose(y,2)
## [1]  1  6 15 28

R cũng thực hiện tương tự như vậy cho tất cả các hàm toán học khác.

Bài tập 2.5

  1. Biến đổi tất các thành phần của vectơ c(2, 0.5, 1, 2, 0.5, 1, 2, 0.5, 1) thành 1 bằng cách sử dụng một vectơ có độ dài là 3.
  2. Đổi nhiệt độ F sau đây thành độ C: 45, 77, 20, 19, 101, 120, 212 (Google công thức đổi độ F sang độ C).
  3. Dựa vào hai vectơ c(2, 4, 6)c(1, 2) kết hợp với hàm rep() và phép nhân * để tạo ra vectơ c(2, 4, 6, 4, 8, 12).
  4. Ghi đè 4 thành phần giữa của vectơ (c) bằng hai giá trị -0.1 và -100 được lặp lại theo thứ tự này.

Bài tập 2.6: Hãy tính các biểu thức sau bằng R

  1. \[\sum_{k=1}^{100}k= 1 + 2 + ... + 100\]
  2. \[\sum_{k=1}^{100}k^2= 1^2 + 2^2 + ... + 100^2\]
  3. \[\prod_{k=1}^{10}k^2=1^2\times 2^2\times 3^2\times...\times 10^2\]
  4. \[\sum_{i=10}^{100}(i^3-4i^2)\]
  5. \[\frac{1}{1\times 2}+\frac{1}{2\times 3}+...+\frac{1}{9\times 10}\]
  6. \[C_{10}^0 + C_{10}^1 +...+ C_{10}^{10}\]
  7. \[A_{10}^0 + A_{10}^1 +...+ A_{10}^{10}\]

Tóm tắt

Hàm/Toán tử Chức năng
+, -, *, /, ^, %%, %/% Tính toán số học
sqrt() Căn bậc hai
log() Logarit cơ số e
exp() Hàm mũ
<-, = Gán đối tượng
c() Tạo vectơ
:, seq() Tạo dãy số
rep() Lặp vectơ
sort() Sắp xếp các giá trị của vectơ
length() Xác định độ dài vectơ
[] Trích xuất thành phần vectơ
sum() Tổng tất cả thành phần vectơ
prod() Tích tất cả thành phần vectơ
factorial() Tính giai thừa
choose() Tính tổ hợp

Tài liệu tham khảo

Davies, Tilman M. 2016. The Book of R: A First Course in Programming and Statistics. No Starch Press.