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.
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 |
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
if(điều kiện){
nội dung
}
x = 20
if(x > 5){
print(x)
}
## [1] 20
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"
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"
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"
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
# 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"
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"
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
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