Những vấn đề cơ bản với R

Tính toán cơ bản

R có thể làm được các phép tính toán cơ bản tương tự Stata. Một số phép tính phổ biến như sau:

Phép tính Câu lệnh
Cộng +
Trừ -
Nhân *
Chia /
^
Căn bậc 2 sqrt()
log cơ số 10 log10
log tự nhiên log

Trong Stata, chúng ta cần đặt câu lệnh di ở trước mỗi phép tính. Ở R, chúng ta thoải mái nhập thẳng vào Console và nhận kết quả ở đó.

(1 - 3 + 4*2)/sqrt(10) + log10(100)
## [1] 3.897367

Gán dữ liệu

Chúng ta sử dụng dấu <- để gán dữ liệu. Trong trường hợp này, ta muốn gán giá trị 1 và đối tượng x.

x <- 1
x
## [1] 1
msg <- "hello"
msg
## [1] "hello"

Cần lưu ý rằng R phân biệt chữ hoa và chữ thường.

Chúng ta có thể ghi chú bằng cách thêm # đằng trước mỗi ghi chú. R sẽ không chạy những gì ở phía sau #. Dấu # là kí tự duy nhất giúp ghi chú trong R. Ngược lại, trong Stata ta có thể sử dụng // hoặc dấu hoa thị để ghi chú.

X <- 3 # Cái này sẽ khác với x <- 1
print(X)
## [1] 3

Trình bày dữ liệu

Có thể thấy ở trên, chúng ta có 2 cách xuất dữ liệu vào Console

x <- 1 
x # Cách 1
## [1] 1
X <- 3
print(X)  #Cách 2
## [1] 3

Bên cạnh đó, chúng ta có thể nhìn dữ liệu ở cửa sổ Source bằng cách sử dụng lệnh View()

msg <- "Hello"
View(msg) # Cách 3

Đối tượng R (R Object)

Tất cả những gì được gán giá trị, và xuất hiện trong cửa sổ Environment, đều được gọi là Đối tượng R, hay là R Objects.

Đối tượng R có nhiều cấu trúc dữ liệu
1. Vector
2. Matrix
3. List
4. Data Frame

Đầu tiên ta đến với Vector.

Vector

Vector có thể được hiểu đơn giản là một biến số. Đây là cấu trúc đơn giản nhất của R Object. Giống như tế bào là đơn vị nhỏ nhất của cơ thể.

Vector có 5 nhóm - Character - Numeric (số thực) - Integer (số nguyên) - Complex (số phức) - Logical (TRUE/FALSE)

Vector chỉ chứa những giá trị có trong cùng 1 nhóm.

Numeric

Có nhiều cách để tạo numeric vector

# Trực tiếp gán giá trị
x <- 1:10 
x
##  [1]  1  2  3  4  5  6  7  8  9 10
class(x)
## [1] "integer"
y <- seq(from = 1, to = 10,by = 2)
y
## [1] 1 3 5 7 9
class(y)
## [1] "numeric"
z <- c(1,11,5,10) # c() nghĩa là combine, tức là kết nối các giá trị thành vector
z
## [1]  1 11  5 10
class(z)
## [1] "numeric"
# Hoặc tạo numeric vector trống. Sau đó ta sẽ thêm giá trị vào sau
a <- vector(mode = "numeric", length = 10)
print(a)
##  [1] 0 0 0 0 0 0 0 0 0 0
class(a)
## [1] "numeric"

Character

Tất cả các giá trị nhóm character đều ở trong dấu nháy kép "", hoặc nháy đơn ’’

myname <- c("Kim","Van","Thanh")
print(myname)
## [1] "Kim"   "Van"   "Thanh"
class(myname)
## [1] "character"
number <- c("one","2","3","four")
number
## [1] "one"  "2"    "3"    "four"
class(number)
## [1] "character"

Logic

Vector dạng logic sẽ có 2 giá trị là TRUE và FALSE. TRUE và FALSE có thể viết tắt là T và F.

Giá trị TRUE và FALSE không ở trong ngoặc kép, nếu không sẽ được hiểu là character

logic <- c(TRUE, FALSE, T, F)
logic
## [1]  TRUE FALSE  TRUE FALSE
class(logic)
## [1] "logical"

Một điều thú vị là, R hiểu TRUE tương ứng với 1, vòn FALSE là 0.

logic <- c(TRUE, FALSE, T, F)
sum(logic)  ## Cộng các giá trị trong vector lại
## [1] 2
# Cơ chế như sau
TRUE + FALSE + TRUE + FALSE
## [1] 2

Chuyển nhóm dữ liệu

Đôi khi R object thuộc các nhóm khác nhau được trộn chung lại. Khi đó hiện tượng chuyển nhóm dữ liệu (coercion) sẽ diễn ra. Nó đảm bảo rằng các giá trị trong một vector ở cùng một nhóm dữ liệu.

x <- c(1.7,"a")
x ## Chuyển về character
## [1] "1.7" "a"
class(x)
## [1] "character"
y <- c(TRUE, 2) 
y ## Chuyển về numeric
## [1] 1 2
class(y)
## [1] "numeric"
z <- c("a", TRUE)
z ## Chuyển về character
## [1] "a"    "TRUE"
class(z)
## [1] "character"

Chúng ta cũng có thể chuyển nhóm dữ liệu bằng hệ thống các hàm có cấu trúc như sau as + nhóm dữ liệu muốn chuyển. Ví dụ as.numeric, as.character.

x <- 0:6
print(x)
## [1] 0 1 2 3 4 5 6
class(x)
## [1] "integer"
x <- as.numeric(x)
print(x)
## [1] 0 1 2 3 4 5 6
class(x)
## [1] "numeric"
a <- as.logical(x)
print(a) ## Lưu ý: 0 được hiểu là FALSE, còn các giá trị khác 0 là TRUE
## [1] FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
b <- as.character(x)
print(b)
## [1] "0" "1" "2" "3" "4" "5" "6"

Thỉnh thoảng, R không biết làm sao để chuyển dạng, và nó sẽ tạo ra NA (Non Applicaty), hay có thể hiểu là giá trị khuyết (missing data).

x <- c("a","b","c")
as.numeric(x)
## Warning: NAs introduced by coercion
## [1] NA NA NA
as.logical(x)
## [1] NA NA NA
as.complex(x)
## Warning: NAs introduced by coercion
## [1] NA NA NA

Matrix (ma trận)

Matrix là vector + dimension (2 chiều).

Bản thân đặc tính dimension này là một integer vecotor có độ dài là 2, giá trị thứ nhất là số hàng, giá trị thứ hai là số cột.

m <- matrix(1:10, nrow=2, ncol = 5)
m
##      [,1] [,2] [,3] [,4] [,5]
## [1,]    1    3    5    7    9
## [2,]    2    4    6    8   10
dim(m)
## [1] 2 5
attributes(m)
## $dim
## [1] 2 5

Các giá trị của matrix được đổ theo cột (collumn-wise).

Matrix có thể được được tạo bằng cách gán đặc tính (dimension attributes) vào vector.

m <- 1:10
m
##  [1]  1  2  3  4  5  6  7  8  9 10
dim(m) ## Vì m là vector nên không có dimension attributes
## NULL
dim(m) <- c(5,2) ## Gán gái trị cho dimension attributes, với số hàng là 5, số cột là 2
m
##      [,1] [,2]
## [1,]    1    6
## [2,]    2    7
## [3,]    3    8
## [4,]    4    9
## [5,]    5   10

Hoặc, matrix được tạo bằng cách ghép các vector cùng độ dài lại

x <- 1:3 # Độ dài 3
y <- 10:12 # Độ dài 3
cbind(x,y) # Ghép theo cột
##      x  y
## [1,] 1 10
## [2,] 2 11
## [3,] 3 12
rbind(x,y) # GHép theo hàng
##   [,1] [,2] [,3]
## x    1    2    3
## y   10   11   12