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:
- Nhóm data: Chứa các dữ liệu matrix,array, data.frame, xts,… là các dữ liệu có từ ít nhất 2 chiều trở lên (gồm dòng và cột và các chiều khác). Thường là các dữ liệu input cho các model và xử lý thống kê, đồ thị của R.
- Nhóm value: vector,num, char,int, factor(dùng cho các biến có dạng phân loại, gán nhãn), list,… là các dữ liệu có 1 chiều (vector, list) hoặc là biến (num, char,int,…).
- Nhóm function: các hàm số trong R, sử dụng để biến đổi dữ liệu thành các kết quả.
- Đối với các kết quả trả về từ hồi qui, đồ thị, thống kê thông thường sẽ là 1 list, trong list sẽ chứa các element tương ứng với các phần mà package chạy model, vẽ đồ thị, thống kê muốn trả về.
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
<- matrix(1:12, nrow = 3, ncol = 4)
y # Tao matric tu cac vector
<- c(12,3,45,2)
cells <- c("R1","R2")
rnames <- c("C1","C2")
cnames <- matrix(cells, nrow = 2, ncol = 2, byrow = TRUE,
mymatrix1 dimnames = list(rnames,cnames))
mymatrix1
## C1 C2
## R1 12 3
## R2 45 2
# Khibyrow = FALSE
<- matrix(cells, nrow = 2, ncol = 2, byrow = FALSE,
mymatrix2 dimnames = list(rnames,cnames))
mymatrix2
## C1 C2
## R1 12 45
## R2 3 2
#Cung co the tao matrix tu data frame
<- data.frame(seq(1,5,1),seq(2,6,1))
df colnames(df) <- c("x","y")
<- as.matrix(df)
mymatrix3 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.
<- c(5,9,3,10,11,12,13,14,15)
v <- c("C1","C2","C3")
cnames <- c("R1","R2","R3")
rnames <- c("Matrix1","Matrix2")
mnames <- array(v, dim = c(3,3,2),
arr 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.
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
<- data.frame(
df 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)
%>% datatable() df
Để 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
<- rbind(df,c(11,"Last",900,"1990-12-01"))
df 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
-8,] 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
## 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
<- c(rnorm(11,100,10))
newcol <- data.frame(df,newcol)
df 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
2,2] df[
## [1] "Oanh"
2,2] <- c("Khánh Linh")
df[ 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
<- list(c(1,2,3),"Quý","Trần Quang",df,TRUE, 12.4,434.523)
newList 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,…)
<- list(c(1,2,3),"Quý","Trần Quang",df,TRUE, 12.4,434.523)
newList 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:
1] newList[
## $STT
## [1] 1 2 3
- Cách 2: Sử dụng tên của phần tử
$STT newList
## [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
$'Data Frame' newList
## 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
<- list(1,2,3)
list1 <- list("A","B","C")
list2 # merge 2 list
<- c(list1,list2)
mergedList 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
<- list(1:5)
list1 list1
## [[1]]
## [1] 1 2 3 4 5
<- list(5:10)
list2 list2
## [[1]]
## [1] 5 6 7 8 9 10
#chuyen hoa thanh vector
<- unlist(list1)
v1 v1
## [1] 1 2 3 4 5
<- unlist(list2)
v2 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
<- list("Name",df)
newList 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
<- unlist(newList[2])
newDataFrame 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
<- 12.3
x1 class(x1)
## [1] "numeric"
# Biến integer
<- 1L
x2 class(x2)
## [1] "integer"
# Biến complex
<- 3+2i
x3 class(x3)
## [1] "complex"
# Biến logical
<- TRUE
x4 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ố.
<- "Hi, I'm Quy 1988"
x5 <- charToRaw(x5)
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
<- c(1,2,3)
x1 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:
<- c(1,2,"Quy")
x 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