Dữ liệu trong R

R là một trong những ngôn ngữ có tập hợp kiểu đa dạng và phức tạp bởi lý do đây là ngôn ngữ lai tạp giữa thống kê, lập trình, truy vấn dữ liệu và xử lý dữ liệu nên về thiêt kế R vừa có thể lập trình được (gồm các hàm và biến), vừa có thể truy vấn và xử lý dữ liệu được (gồm bảng, vector, matrix), vừa có thể vẽ đồ thị, hồi qui model và lưu trữ kết quả hồi qui (gồm các list, function) Về cơ bản định dạng kiểu trong R sẽ được chia vào 3 nhóm:

Các dạng dữ liệu trong R

Dữ liệu dạng Ma trận (Matrix)

Matrix là một dữ liệu có dạng ma trận kích thước mxn. Trong đó m là số dòng, n là số cột. Các dòng và các cột của một matrix phải cùng độ dài và kiểu dữ liệu. Các tùy chọn: byrow = TRUE sẽ tạo ra matrix có thể được filled theo dòng, byrow = FALSE sẽ tạo ra matrix được filled theo cột. dimnames là tùy chọn trong R, sẽ là tên nhãn được gán cho dòng và cột.

# Tao matric 3x4
y <- matrix(1:12, nrow = 3, ncol = 4)
# Tao matric tu cac vector
cells <- c(12,3,45,2)
rnames <- c("R1","R2")
cnames <- c("C1","C2")
mymatrix1 <- matrix(cells, nrow = 2, ncol = 2, byrow = TRUE,
                   dimnames = list(rnames,cnames))
mymatrix1
##    C1 C2
## R1 12  3
## R2 45  2
# Khibyrow = FALSE
mymatrix2 <- matrix(cells, nrow = 2, ncol = 2, byrow = FALSE,
                    dimnames = list(rnames,cnames))
mymatrix2
##    C1 C2
## R1 12 45
## R2  3  2
#Cung co the tao matrix tu data frame
df <- data.frame(seq(1,5,1),seq(2,6,1))
colnames(df) <- c("x","y")
mymatrix3 <- as.matrix(df)
mymatrix3
##      x y
## [1,] 1 2
## [2,] 2 3
## [3,] 3 4
## [4,] 4 5
## [5,] 5 6

Mảng - Arrays

Array về cơ bản tương tự như matrix nhưng có thể có nhiều chiều hơn. Chẳng hạn như trong không gian 3 chiều, mỗi mặt cắt là một mặt phẳng có 2 chiều x,y. Các chiều này có thể biểu diễn trên matrix. Tuy nhiên để biểu diễn được toàn bộ không gian thì cần rất nhiều mặt phẳng và Array sẽ tổng hợp các matrix đó để biểu diễn thêm được số chiều. cú pháp của array:

Ví dụ sau đây sẽ tạo thành một array 3 chiều là tập hợp của 3 matrix 3x3.

v <- c(5,9,3,10,11,12,13,14,15)
cnames <- c("C1","C2","C3")
rnames <- c("R1","R2","R3")
mnames <- c("Matrix1","Matrix2")
arr <- array(v, dim = c(3,3,2),
             dimnames = list(rnames,cnames,mnames))
arr
## , , Matrix1
## 
##    C1 C2 C3
## R1  5 10 13
## R2  9 11 14
## R3  3 12 15
## 
## , , Matrix2
## 
##    C1 C2 C3
## R1  5 10 13
## R2  9 11 14
## R3  3 12 15

DataFrame

Data frame là dữ liệu dạng bảng có mối liên hệ 2 chiều (hàng và cột). Mỗi chiều đại diện cho 1 trường có cùng kiểu dữ liệu và mỗi dòng đại diện cho một bản ghi hay quan sát. Một data frame phải thỏa mãn những tính chất sau đây:

  • Tên của cột không được empty

  • Tên của dòng phải là duy nhất.

  • Kiểu dữ liệu của cột store trong data frame phải là numeric, factor và character.

  • Độ dài dữ liệu các cột phải bằng nhau.

Cú pháp để tạo một data frame trong R:

data.frame(vector1,vector2,…,StringsAsFactors = FALSE), trong đó:

  • vector1,vector2,… là các vector có cùng độ dài.
  • StringAsFactors có tác dụng xác định một biến character có dạng factor hay không (factor có thể hiểu là các gía trị của một biến định tinh chẳng hạn như (nam, nữ), (quí 1, quí 2, quí 3, quí 4),…).

library(DT)
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
# Tạo một data frame
df <- data.frame(
  STT = c(seq(1,10,1)),
  Name = c("Quý","Oanh","Linh","Thanh","Alex","Mari","Bayes","Jon","Jame","But"),
  Salary = round(rnorm(10,100,20),3),
  Birthday = as.Date(c("1993-07-09","1998-11-21","1994-06-09","1999-07-06","1992-05-19","1993-07-09","1998-11-21","1994-06-09","1999-07-06","1992-05-19")),stringsAsFactors = FALSE)
df %>% datatable()

Để kiểm tra định dạng các biến trong một data.frame ta dùng hàm str(dataframe_name)

str(df)
## 'data.frame':    10 obs. of  4 variables:
##  $ STT     : num  1 2 3 4 5 6 7 8 9 10
##  $ Name    : chr  "Quý" "Oanh" "Linh" "Thanh" ...
##  $ Salary  : num  89.8 112.7 115.3 139.5 85.9 ...
##  $ Birthday: Date, format: "1993-07-09" "1998-11-21" ...

Chúng ta cũng có thể có một số thống kê cơ bản về các trường dữ liệu bằng hàm summary. Kết quả trả về sẽ gồm trung bình, min, max, median, các giá trị tới hạn của phân vị thứ 1,3

summary(df)
##       STT            Name               Salary          Birthday         
##  Min.   : 1.00   Length:10          Min.   : 85.91   Min.   :1992-05-19  
##  1st Qu.: 3.25   Class :character   1st Qu.: 95.76   1st Qu.:1993-07-09  
##  Median : 5.50   Mode  :character   Median :111.36   Median :1994-06-09  
##  Mean   : 5.50                      Mean   :108.42   Mean   :1995-09-30  
##  3rd Qu.: 7.75                      3rd Qu.:115.09   3rd Qu.:1998-11-21  
##  Max.   :10.00                      Max.   :139.47   Max.   :1999-07-06

Bên cạnh đó một số package còn đưa ra được nhiều thông tin hơn chẳng hạn như basicStats (gói này chỉ hoạt động với các biến dạng numeric)

library(fBasics)
basicStats(df[,c(1,3)])
##                   STT      Salary
## nobs        10.000000   10.000000
## NAs          0.000000    0.000000
## Minimum      1.000000   85.906000
## Maximum     10.000000  139.472000
## 1. Quartile  3.250000   95.756500
## 3. Quartile  7.750000  115.091500
## Mean         5.500000  108.417800
## Median       5.500000  111.365000
## Sum         55.000000 1084.178000
## SE Mean      0.957427    5.029428
## LCL Mean     3.334149   97.040443
## UCL Mean     7.665851  119.795157
## Variance     9.166667  252.951496
## Stdev        3.027650   15.904449
## Skewness     0.000000    0.214945
## Kurtosis    -1.561636   -0.819527

Thêm 1 dòng vào data frame

df <- rbind(df,c(11,"Last",900,"1990-12-01"))
df
##    STT  Name  Salary   Birthday
## 1    1   Quý  89.759 1993-07-09
## 2    2  Oanh 112.675 1998-11-21
## 3    3  Linh 115.337 1994-06-09
## 4    4 Thanh 139.472 1999-07-06
## 5    5  Alex  85.906 1992-05-19
## 6    6  Mari 117.031 1993-07-09
## 7    7 Bayes  91.719 1998-11-21
## 8    8   Jon 110.055 1994-06-09
## 9    9  Jame 107.869 1999-07-06
## 10  10   But 114.355 1992-05-19
## 11  11  Last     900 1990-12-01

Xóa một dòng dữ liệu trong data frame

df[-8,]
##    STT  Name  Salary   Birthday
## 1    1   Quý  89.759 1993-07-09
## 2    2  Oanh 112.675 1998-11-21
## 3    3  Linh 115.337 1994-06-09
## 4    4 Thanh 139.472 1999-07-06
## 5    5  Alex  85.906 1992-05-19
## 6    6  Mari 117.031 1993-07-09
## 7    7 Bayes  91.719 1998-11-21
## 9    9  Jame 107.869 1999-07-06
## 10  10   But 114.355 1992-05-19
## 11  11  Last     900 1990-12-01

Thêm 1 cột trong data frame

newcol <- c(rnorm(11,100,10))
df <- data.frame(df,newcol)
df
##    STT  Name  Salary   Birthday    newcol
## 1    1   Quý  89.759 1993-07-09  89.48959
## 2    2  Oanh 112.675 1998-11-21  98.02500
## 3    3  Linh 115.337 1994-06-09  96.95970
## 4    4 Thanh 139.472 1999-07-06  79.15539
## 5    5  Alex  85.906 1992-05-19 109.11713
## 6    6  Mari 117.031 1993-07-09 115.47620
## 7    7 Bayes  91.719 1998-11-21  98.23407
## 8    8   Jon 110.055 1994-06-09  97.13700
## 9    9  Jame 107.869 1999-07-06 117.40647
## 10  10   But 114.355 1992-05-19  92.24898
## 11  11  Last     900 1990-12-01 115.83254

Update một phần tử trong data frame

df[2,2]
## [1] "Oanh"
df[2,2] <- c("Khánh Linh")
df
##    STT       Name  Salary   Birthday    newcol
## 1    1        Quý  89.759 1993-07-09  89.48959
## 2    2 Khánh Linh 112.675 1998-11-21  98.02500
## 3    3       Linh 115.337 1994-06-09  96.95970
## 4    4      Thanh 139.472 1999-07-06  79.15539
## 5    5       Alex  85.906 1992-05-19 109.11713
## 6    6       Mari 117.031 1993-07-09 115.47620
## 7    7      Bayes  91.719 1998-11-21  98.23407
## 8    8        Jon 110.055 1994-06-09  97.13700
## 9    9       Jame 107.869 1999-07-06 117.40647
## 10  10        But 114.355 1992-05-19  92.24898
## 11  11       Last     900 1990-12-01 115.83254

List - Danh sách

List là một object trong R chứa nhiều phần tử có định dạng khác nhau như numeric, string, vector, và thậm chí là trong list có thể chứa các list khác. Một list có thể chứa cả hàm, data frame, array và matrix như là những phần tử của nó. Để khởi tạo một list ta sử dụng hàm list

newList <- list(c(1,2,3),"Quý","Trần Quang",df,TRUE, 12.4,434.523)
newList
## [[1]]
## [1] 1 2 3
## 
## [[2]]
## [1] "Quý"
## 
## [[3]]
## [1] "Tr<U+1EA7>n Quang"
## 
## [[4]]
##    STT       Name  Salary   Birthday    newcol
## 1    1        Quý  89.759 1993-07-09  89.48959
## 2    2 Khánh Linh 112.675 1998-11-21  98.02500
## 3    3       Linh 115.337 1994-06-09  96.95970
## 4    4      Thanh 139.472 1999-07-06  79.15539
## 5    5       Alex  85.906 1992-05-19 109.11713
## 6    6       Mari 117.031 1993-07-09 115.47620
## 7    7      Bayes  91.719 1998-11-21  98.23407
## 8    8        Jon 110.055 1994-06-09  97.13700
## 9    9       Jame 107.869 1999-07-06 117.40647
## 10  10        But 114.355 1992-05-19  92.24898
## 11  11       Last     900 1990-12-01 115.83254
## 
## [[5]]
## [1] TRUE
## 
## [[6]]
## [1] 12.4
## 
## [[7]]
## [1] 434.523

Ta có thể thấy mỗi phần tử sẽ được lưu vào trong list theo đúng vị trí khởi tạo của nó (vị trí thứ i của list kí hiệu là [[i]]). Đặt tên cho 1 list như sau:

names(newList) <- c(name_element1,name_element2,name_element3,…)

newList <- list(c(1,2,3),"Quý","Trần Quang",df,TRUE, 12.4,434.523)
names(newList) <- c("STT","Tên","Họ và Tên đệm", "Data Frame","Logical","Numeric1","Numeric2")
newList
## $STT
## [1] 1 2 3
## 
## $Tên
## [1] "Quý"
## 
## $`H<U+1ECD> và Tên d<U+1EC7>m`
## [1] "Tr<U+1EA7>n Quang"
## 
## $`Data Frame`
##    STT       Name  Salary   Birthday    newcol
## 1    1        Quý  89.759 1993-07-09  89.48959
## 2    2 Khánh Linh 112.675 1998-11-21  98.02500
## 3    3       Linh 115.337 1994-06-09  96.95970
## 4    4      Thanh 139.472 1999-07-06  79.15539
## 5    5       Alex  85.906 1992-05-19 109.11713
## 6    6       Mari 117.031 1993-07-09 115.47620
## 7    7      Bayes  91.719 1998-11-21  98.23407
## 8    8        Jon 110.055 1994-06-09  97.13700
## 9    9       Jame 107.869 1999-07-06 117.40647
## 10  10        But 114.355 1992-05-19  92.24898
## 11  11       Last     900 1990-12-01 115.83254
## 
## $Logical
## [1] TRUE
## 
## $Numeric1
## [1] 12.4
## 
## $Numeric2
## [1] 434.523

Có 2 cách đê truy cập các phần tử trong list:

  • Cách 1: Dùng số thứ tự để truy cập:
newList[1]
## $STT
## [1] 1 2 3
  • Cách 2: Sử dụng tên của phần tử
newList$STT
## [1] 1 2 3
# Khi phần tử có tên cách nhau bởi khoảng trắng thì phải sử dụng nháy đơn
newList$'Data Frame'
##    STT       Name  Salary   Birthday    newcol
## 1    1        Quý  89.759 1993-07-09  89.48959
## 2    2 Khánh Linh 112.675 1998-11-21  98.02500
## 3    3       Linh 115.337 1994-06-09  96.95970
## 4    4      Thanh 139.472 1999-07-06  79.15539
## 5    5       Alex  85.906 1992-05-19 109.11713
## 6    6       Mari 117.031 1993-07-09 115.47620
## 7    7      Bayes  91.719 1998-11-21  98.23407
## 8    8        Jon 110.055 1994-06-09  97.13700
## 9    9       Jame 107.869 1999-07-06 117.40647
## 10  10        But 114.355 1992-05-19  92.24898
## 11  11       Last     900 1990-12-01 115.83254
# tạo ra 2 list
list1 <- list(1,2,3)
list2 <- list("A","B","C")
# merge 2 list
mergedList <- c(list1,list2)
mergedList
## [[1]]
## [1] 1
## 
## [[2]]
## [1] 2
## 
## [[3]]
## [1] 3
## 
## [[4]]
## [1] "A"
## 
## [[5]]
## [1] "B"
## 
## [[6]]
## [1] "C"
# Chuyển hóa list thành vector
# tạo 2 list
list1 <- list(1:5)
list1
## [[1]]
## [1] 1 2 3 4 5
list2 <- list(5:10)
list2
## [[1]]
## [1]  5  6  7  8  9 10
#chuyen hoa thanh vector
v1 <- unlist(list1)
v1
## [1] 1 2 3 4 5
v2 <- unlist(list2)
v2
## [1]  5  6  7  8  9 10
# Chuyển hóa một list thành một vector khi phần tử được chuyển dạng data frame
#tạo list chứa df
newList <- list("Name",df)
newList
## [[1]]
## [1] "Name"
## 
## [[2]]
##    STT       Name  Salary   Birthday    newcol
## 1    1        Quý  89.759 1993-07-09  89.48959
## 2    2 Khánh Linh 112.675 1998-11-21  98.02500
## 3    3       Linh 115.337 1994-06-09  96.95970
## 4    4      Thanh 139.472 1999-07-06  79.15539
## 5    5       Alex  85.906 1992-05-19 109.11713
## 6    6       Mari 117.031 1993-07-09 115.47620
## 7    7      Bayes  91.719 1998-11-21  98.23407
## 8    8        Jon 110.055 1994-06-09  97.13700
## 9    9       Jame 107.869 1999-07-06 117.40647
## 10  10        But 114.355 1992-05-19  92.24898
## 11  11       Last     900 1990-12-01 115.83254
#chuyển hóa phần tử thứ 2 sang data frame
newDataFrame <- unlist(newList[2])
newDataFrame
##               STT1               STT2               STT3               STT4 
##                "1"                "2"                "3"                "4" 
##               STT5               STT6               STT7               STT8 
##                "5"                "6"                "7"                "8" 
##               STT9              STT10              STT11              Name1 
##                "9"               "10"               "11"              "Quý" 
##              Name2              Name3              Name4              Name5 
##       "Khánh Linh"             "Linh"            "Thanh"             "Alex" 
##              Name6              Name7              Name8              Name9 
##             "Mari"            "Bayes"              "Jon"             "Jame" 
##             Name10             Name11            Salary1            Salary2 
##              "But"             "Last"           "89.759"          "112.675" 
##            Salary3            Salary4            Salary5            Salary6 
##          "115.337"          "139.472"           "85.906"          "117.031" 
##            Salary7            Salary8            Salary9           Salary10 
##           "91.719"          "110.055"          "107.869"          "114.355" 
##           Salary11          Birthday1          Birthday2          Birthday3 
##              "900"             "8590"            "10551"             "8925" 
##          Birthday4          Birthday5          Birthday6          Birthday7 
##            "10778"             "8174"             "8590"            "10551" 
##          Birthday8          Birthday9         Birthday10         Birthday11 
##             "8925"            "10778"             "8174"             "7639" 
##            newcol1            newcol2            newcol3            newcol4 
## "89.4895864397136"  "98.025002411875" "96.9596991531046" "79.1553882456188" 
##            newcol5            newcol6            newcol7            newcol8 
## "109.117126071551" "115.476199354285"  "98.234073426568" "97.1369977588154" 
##            newcol9           newcol10           newcol11 
## "117.406472292726" "92.2489769021495" "115.832540006484"

Các kiểu dữ liệu trong R

Trong các ngôn ngữ lập trình bạn sẽ sử dụng biến để lưu trữ rất nhiều thông tin khác nhau. Khi một biến được khởi tạo, giá trị của nó sẽ được lưu trữ trên ô nhớ của máy tính. Nhờ đó mà biến có thể được gọi và tái sử dụng trong project. Một biến có thể được lưu trữ dưới nhiều định dạng khác nhau như character, wide character, integer, floating point, double floating point, boolean,…. Dựa trên các định dạng đó mà hệ điều hành sẽ quyết định phân bổ vùng địa chỉ nhớ để lưu trữ các biến này. Trái với các ngôn nhữ lập trình như C hay java, biến trong R không cần phải khai báo trước định dạng. Các kiểu định dạng biến trong R gồm 6 loại cơ bản: Logical (nhận giá trị TRUE hoặc FALSE), Numeric, Integer, Complex (số phức), Character, Raw(lưu các kí tự dưới dạng mã máy).

Định dạng biến:

Định dạng number là định dạng có tính chất định lượng, có thể thực hiện các phép toán số học với nó. Thông thường trong R định dạng số có những loại sau: Numeric, Integer, Complex.

  • Biến numeric có dạng thập phân gồm 2 phần: phần nguyên và phần thập phân.

  • Biến Integer là biến số nguyên, không có phần thập phân phía sau.

  • Biến complex là biến số phức gồm phần số thực và phần phức.

Để phân biệt các loại biến này chúng ta đi vào các ví dụ sau:

# Biến numeric
x1 <- 12.3
class(x1)
## [1] "numeric"
# Biến integer
x2 <- 1L
class(x2)
## [1] "integer"
# Biến complex
x3 <- 3+2i
class(x3)
## [1] "complex"
# Biến logical
x4 <- TRUE
class(x4)
## [1] "logical"
# Định dạng raw: là kiểu định dạng đã mã hóa các kí tự dưới dạng số.
x5 <- "Hi, I'm Quy 1988"
x5 <- charToRaw(x5)
x5
##  [1] 48 69 2c 20 49 27 6d 20 51 75 79 20 31 39 38 38

Nguyên tắc đặt tên biến

Mỗi một biến của R khi được khởi tạo sẽ được đặt tên. Nhờ vào tên gọi của biến mà R có thể thao tác với biến được dễ dàng. Tên của một biến bao gồm các kí tự, số, dấu chấm (.), gạch chân (_). Một biến bắt đầu với một kí tự hoặc dấu chấm thì theo sau nó không thể là một số.

  • Không được bắt đầu bằng số chẳng hạn 2varname

  • Bắt đầu bằng dấu chấm hoặc kí tự thì theo sau không được là số chẳng hạn .2varname

  • Không được bắt đầu bằng ki tự gạch chân chẳng hạn **_varname**

  • Không được chứa các kí tự khác các kí tự số, chữ, dấu chấm và gạch chân chẳng hạn %varname

Vector

Vector là kiểu dữ liệu chứa nhiều phần tử trong nó. Các phần tử trong cùng 1 vector phải cùng kiểu. Cách tạo một vector:

# Tạo một vector
x1 <- c(1,2,3)
x1
## [1] 1 2 3
# Tìm hiểu kiểu của x:
class(x1)
## [1] "numeric"
# Khi các phần tử trong 1 Vector lưu các biến khác kiểu:
x <- c(1,2,"Quy")
x
## [1] "1"   "2"   "Quy"
#các giá trị số sẽ tự động được chuyển sang kí tự
class(x[1])
## [1] "character"

Tài liệu tham khảo:

[1]. https://phamdinhkhanh.github.io/about

[2]. https://swcarpentry.github.io/r-novice-inflammation/13-supp-data-structures