Khi bắt đầu học một ngôn ngữ lập trình nào R nói chung hay bất cứ một ngôn ngữ nào khác đi nữa.Chúng ta cần hiểu rõ về những vấn đề mặc dù rất cơ bản như là kiểu dữ liệu, cấu trúc điều khiển, …Và đó là lí do mình muốn giới thiệu với các bạn những gì là cơ bản nhất về ngôn ngữ R trước khi làm phân tích về thống kê hay những điều lớn hơn.

1.Những kiểu dữ liệu cơ bản trong R

R cung cấp cho chúng ta rất đa dạng về kiểu của dữ liệu,một trong số đó được tổ chức theo chiều và nội dung(đồng nhất hoặc không đồng nhất).

Type <- c("1-D","2-D","n-D")
Homogeneous <- c("Atomic vector","Matrix","Array")
Heterogeneous <- c("List*","Data Frame"," ")
dfType <- data.frame(Type,Homogeneous,Heterogeneous)
knitr::kable(dfType)
Type Homogeneous Heterogeneous
1-D Atomic vector List*
2-D Matrix Data Frame
n-D Array

2.Hoạt động trong R

Cú pháp của các toán tử trong R rất giống với các ngôn ngữ lập trình khác. Sau đây là danh sách toán tử cùng với giải thích ý nghĩa của chúng. Bảng sau định nghĩa các toán tử số học khác nhau:

Operators = c("+","-","*","/","** or ^","%%","%/%")
Explanations = c("Addition","Subtraction","Multiplication","Division","Exponentiation","Modulus","Integer Quotient")
Syntax  =data.frame(Operators,Explanations)
knitr::kable(Syntax)
Operators Explanations
+ Addition
- Subtraction
* Multiplication
/ Division
** or ^ Exponentiation
%% Modulus
%/% Integer Quotient

Tiếp theo sẽ là vế các toán tử logic.

Operators = c("==","<",">","<=",">=")
Explanations = c("Expact equal to","Less than","Greater than","Less than or equal to","Greater than or equal to")
Syntax = data.frame(Operators,Explanations)
knitr::kable(Syntax)
Operators Explanations
== Expact equal to
< Less than
> Greater than
<= Less than or equal to
>= Greater than or equal to

Để minh hoa cho những toán tử trên ta sẽ thực hành bằng ví dụ sau :

m = c(1,2,3,4,5,6,7)
m
## [1] 1 2 3 4 5 6 7
# Cộng vecto với 1 số
m + 6
## [1]  7  8  9 10 11 12 13
# Trừ vecto với 1 số
m -4
## [1] -3 -2 -1  0  1  2  3
#Lấy căn bậc 2 của vecto 
sqrt(m)
## [1] 1.000000 1.414214 1.732051 2.000000 2.236068 2.449490 2.645751
#Bình phương vecto
m^2
## [1]  1  4  9 16 25 36 49

2 Cấu trúc điều khiển trong R

2.1 Cấu trúc rẽ nhánh If

if(điều kiện){
  nội dung 
}
x = 20
if(x > 5){
  print(x)
}
## [1] 20

2.2 Cấu trúc rẽ nhánh If-Esle

if(điều kiện){
  nội dung khi điều kiện đúng
}else{
   nội dung khi điều kiên sai
}
x = 4
if(x %% 2)
{
  print(paste0(x,": la so le"))
}else{
  print(paste0(x," : là so chan"))
}
## [1] "4 : là so chan"

2.3 Hàm Ifelse

ifelse(điều kiện,nội dung khi điều kiện đúng,nội dung khi điều kiện sai)
x = 1:5
ifelse(x %% 2,paste(x," : la so le"),paste0(x," : la so chan"))
## [1] "1  : la so le"  "2 : la so chan" "3  : la so le"  "4 : la so chan"
## [5] "5  : la so le"

2.4 Cấu trúc lặp for

for ( x trong 1 trình tự nào đó){
  nội dung cần lặp
}
x = c("Hoan","Tram","Phuc","My")
for(i in seq(x))
{
  print(x[i])
}
## [1] "Hoan"
## [1] "Tram"
## [1] "Phuc"
## [1] "My"
mat = matrix(1:9,nrow = 3,ncol = 3)
sum = 0
for(i in seq(nrow(mat))){
  for (j in seq(ncol(mat))) {
    sum  =sum + mat[i,j]
    print(sum)
  }
}
## [1] 1
## [1] 5
## [1] 12
## [1] 14
## [1] 19
## [1] 27
## [1] 30
## [1] 36
## [1] 45
x = 5
ngto = 1
for(i in 2:sqrt(x)){
  if(x %% i ==0){
    ngto = 0
  }
}
if(ngto == 1){
  print(paste0(x,": la so nguyen to"))
}else{
  print(paste0(x,": khong la so nguyen to"))
}
## [1] "5: la so nguyen to"

2.5 Cấu trúc lặp vô hạn While

while(điều kiện){
 nội dung khi điều kiện đúng (lặp vô hạn)
}
i = 1
while(i<10){
  print(i)
  i = i + 1
}
## [1] 1
## [1] 2
## [1] 3
## [1] 4
## [1] 5
## [1] 6
## [1] 7
## [1] 8
## [1] 9

2.6 Một số kiểu lặp đặc biệt

# lặp kết hợp với break
for( i in 1:30){
  if(i < 8){
    print(paste0("Gia tri hien tai la :",i))
  }else{
    print(paste0("Gia tri hien tai la :",i,"va dung vong lap"))
    break
  }
}
## [1] "Gia tri hien tai la :1"
## [1] "Gia tri hien tai la :2"
## [1] "Gia tri hien tai la :3"
## [1] "Gia tri hien tai la :4"
## [1] "Gia tri hien tai la :5"
## [1] "Gia tri hien tai la :6"
## [1] "Gia tri hien tai la :7"
## [1] "Gia tri hien tai la :8va dung vong lap"
# Lặp kết hợp với next
for(i in 1:10){
  if(i %% 2){
    print(paste0(i,": la so le"))
  }else{
    next
  }
}
## [1] "1: la so le"
## [1] "3: la so le"
## [1] "5: la so le"
## [1] "7: la so le"
## [1] "9: la so le"

2.7 Cấu trúc lặp Repeat

repeat
{
  nội dung cần lặp đi lặp lại với 1 điều kiện rõ ràng
  bao gồm nội dung thoát khỏi vòng lặp
}
i = 1
repeat
{
  square = i^2
  i  =i+1
  if(square < 36){
    print(paste0(square,": nho hon 36. Va van con dang trong vong lap"))
  }else{
    print(paste0(square," :lon hon hoac bang 36 . Va thoat khoi vong lap"))
    break
  }
}
## [1] "1: nho hon 36. Va van con dang trong vong lap"
## [1] "4: nho hon 36. Va van con dang trong vong lap"
## [1] "9: nho hon 36. Va van con dang trong vong lap"
## [1] "16: nho hon 36. Va van con dang trong vong lap"
## [1] "25: nho hon 36. Va van con dang trong vong lap"
## [1] "36 :lon hon hoac bang 36 . Va thoat khoi vong lap"

3. First-class function

10+20
## [1] 30

hoặc

"+" (10,20)
## [1] 30
4^2
## [1] 16

hoặc

"^" (4,2)
## [1] 16

Bây giờ, hãy đi sâu vào các khái niệm chức năng, vốn rất quan trọng và được sử dụng rộng rãi bởi các lập trình viên R. Các hàm vectơ là một trong những khái niệm chức năng phổ biến nhất cho phép lập trình viên thực hiện các hàm ở mức phần tử riêng cho một vectơ đã cho. Vector này cũng có thể là một phần của khung dữ liệu, ma trận hoặc danh sách.

V_in = 1:100000
V_out  = c()
for(i in V_in){
  V_out = c(V_out,i^2)
}

hoặc

V_in = 1:10
V_out = V_in^2
V_out
##  [1]   1   4   9  16  25  36  49  64  81 100

4 Một số hàm thông dụng khác:

Function = c("apply","lapply","sapply","mapply","tapply","rapply")
Input_data_type = c("dataframe or matrix or array",
                "vecto,list,variables in dataframe or matrix",
                "vector,list,variables in dataframe or matrix",
                "vector,list,variables in dataframe or matrix",
                "ragged array",
                "vector,list,variables")
Output_data_type = c("Vecto,matrix,array,list","list",
                     "matrix,vecto,list",
                     "matrix,vecto,list",
                     "array","list")
df = data.frame(Function,Input_data_type,Output_data_type)
knitr::kable(df)
Function Input_data_type Output_data_type
apply dataframe or matrix or array Vecto,matrix,array,list
lapply vecto,list,variables in dataframe or matrix list
sapply vector,list,variables in dataframe or matrix matrix,vecto,list
mapply vector,list,variables in dataframe or matrix matrix,vecto,list
tapply ragged array array
rapply vector,list,variables list
x = cbind(x1 = 7,x2 = c(7:1,2:5))
col.sums  =apply(x, 2,sum)
row.sums = apply(x,1,sum)
x = list(x1 =7:1,x2 = c(7:1,2:5))
lapply(x,mean)
## $x1
## [1] 4
## 
## $x2
## [1] 3.818182
V_in = 1:10
V_out = sapply(V_in,function(x) x^2)
V_out
##  [1]   1   4   9  16  25  36  49  64  81 100
mapply(rep,1:6,6:1)
## [[1]]
## [1] 1 1 1 1 1 1
## 
## [[2]]
## [1] 2 2 2 2 2
## 
## [[3]]
## [1] 3 3 3 3
## 
## [[4]]
## [1] 4 4 4
## 
## [[5]]
## [1] 5 5
## 
## [[6]]
## [1] 6
dat = list(c(4,2,6,1,5),c("P","T","V","M","H"))
tapply(1:5,dat,sum)
##    H  M  P  T  V
## 1 NA  4 NA NA NA
## 2 NA NA NA  2 NA
## 4 NA NA  1 NA NA
## 5  5 NA NA NA NA
## 6 NA NA NA NA  3
X  =list(list(a=pi,b=list(c=1:1)))
rapply(X,sqrt,classes = "numeric",how = "replace")
## [[1]]
## [[1]]$a
## [1] 1.772454
## 
## [[1]]$b
## [[1]]$b$c
## [1] 1