1 Nhiệm vụ 3.1: population-and-demography

1.1 Giới thiệu:

Nhiệm vụ 3.1 tiến hành thao tác 1 số lệnh cơ bản trên dataset “population-and-demography.csv”. Dataset thống kê dân số và dân số theo từng độ tuổi khác nhau của các nước khác nhau. Dùng phần mềm R để thao tác

1.2 Mô tả cơ bản datasets

  • Là một data frame
  • Có 24 cột tương ứng với 24 giá trị
  • Có 18288 hàng tương ứng với 18288 quan sát
  • Dataset không có dữ liệu trống
  • Ký hiệu các cột là:
    • Country name: Tên quốc gia
    • Year: Năm
    • Population: Dân số
    • Population of children under the age of 1: Dân số của trẻ em dưới 1 tuổi
    • Population of children under the age of 5: Dân số của trẻ em dưới 5 tuổi
    • Population of children under the age of 15: Dân số của trẻ em dưới 15 tuổi
    • Population under the age of 25: Dân số dưới 25 tuổi
    • Population aged 15 to 64 years: Dân số từ 15 đến 64 tuổi
    • Population older than 15 years: Dân số trên 15 tuổi
    • Population older than 18 years: Dân số trên 18 tuổi
    • Population at age 1: Dân số tại lúc 1 tuổi
    • Population aged 1 to 4 years: Dân số từ 1 đến 4 tuổi
    • Population aged 5 to 9 years: Dân sô từ 5 đến 9 tuổi
    • Population aged 10 to 14 years: Dân số từ 10 đến 14 tuổi
    • Population aged 15 to 19 years: Dân số từ 15 đến 19 tuổi
    • Population aged 20 to 29 years: Dân số từ 20 đến 29 tuổi
    • Population aged 30 to 39 years: Dân số từ 30 đến 39 tuổi
    • Population aged 40 to 49 years: Dân số từ 40 đến 49 tuổi
    • Population aged 50 to 59 years: Dân số từ 50 đến 59 tuổi
    • Population aged 60 to 69 years: Dân số từ 60 đến 69 tuổi
    • Population aged 70 to 79 years: Dân số từ 70 đến 79 tuổi
    • Population aged 80 to 89 years: Dân số từ 80 đến 89 tuổi
    • Population aged 90 to 99 years: Dân số từ 90 đến 99 tuổi
    • Population older than 100 years: Dân số trên 100 tuổi

Thực hiện thao tác đọc và gán dữ liệu vào máy. Sau thao tác này thì dữ liệu từ file “population-and-demography.csv” đã được gán vào d như bên dưới

#Đọc dữ liệu từ file csv và gán vào object d
d <- read.csv("D:\\KTLR\\population-and-demography.csv")

Kiểm tra xem “d” có phải là data frame hay không, nếu đúng thì true và ngược lại. Và kết quả trả về là TRUE > d là một dataframe

is.data.frame(d) 
## [1] TRUE

Xác định số hàng, số cột của d dưới dạng vecto. Kết quả trả về thì d tương ứng có 18288 hàng và 24 cột

dim(d)
## [1] 18288    24

Xác định số ô trống của d. Kết quả trả về tương ứng với d không có ô trống nào

sum(is.na(d))
## [1] 0

1.3 Thống kê dữ liệu

Thực hiện thống kê mô tả dataset này ta được kết quả bên dưới, ý nghĩa các cột như sau:

  • n_missing: số ô dữ liệu bị miss(trống)

  • complete_rate: tỷ lệ ô có dữ liệu

  • mean: trung bình

  • sd: độ lệch chuẩn

  • p0: giá trị nhỏ nhất

  • p25: Phân vị thứ nhất

  • p50: Phân vị thứ hai cũng chính là trung vị

  • p75: phân vị thứ ba

  • p100: giá trị lớn nhất

  • hist: biểu đồ Histogram

Xác định các thông tin cơ bản trong d

library(skimr)
skim(d)
Data summary
Name d
Number of rows 18288
Number of columns 24
_______________________
Column type frequency:
character 1
numeric 23
________________________
Group variables None

Variable type: character

skim_variable n_missing complete_rate min max empty n_unique whitespace
Country.name 0 1 4 59 0 254 0

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
Year 0 1 1985.50 20.78 1950 1967.75 1985.5 2003.25 2021 ▇▇▇▇▇
Population 0 1 126470436.62 588851230.77 1363 291591.50 3833997.5 16785463.50 7909295000 ▇▁▁▁▁
Population.of.children.under.the.age.of.1 0 1 3133496.86 14167006.03 25 6663.75 88352.0 463000.50 139783730 ▇▁▁▁▁
Population.of.children.under.the.age.of.5 0 1 14825709.57 67384368.62 136 31995.25 423784.5 2160046.50 690360700 ▇▁▁▁▁
Population.of.children.under.the.age.of.15 0 1 41095227.11 188416973.54 416 89541.50 1186121.5 5905944.75 2015023400 ▇▁▁▁▁
Population.under.the.age.of.25 0 1 63762600.31 294251869.66 623 139541.50 1843099.5 9025129.75 3239281000 ▇▁▁▁▁
Population.aged.15.to.64.years 0 1 77429505.08 367651914.71 748 170263.50 2246772.0 9641250.00 5132999000 ▇▁▁▁▁
Population.older.than.15.years 0 1 85372101.76 404866940.61 849 186716.00 2482104.0 10354345.50 5893678600 ▇▁▁▁▁
Population.older.than.18.years 0 1 78196242.04 372017010.49 752 166417.50 2238130.5 9239904.00 5516283000 ▇▁▁▁▁
Population.at.age.1 0 1 3011212.81 13661998.41 26 6473.75 85824.0 440787.50 138478740 ▇▁▁▁▁
Population.aged.1.to.4.years 0 1 11692212.72 53238243.89 101 25269.25 334454.0 1697850.75 550970400 ▇▁▁▁▁
Population.aged.5.to.9.years 0 1 13598575.21 62534310.11 138 29406.25 392220.5 1947260.75 683611800 ▇▁▁▁▁
Population.aged.10.to.14.years 0 1 12670942.28 58775457.46 73 27879.50 363895.5 1796754.00 659934300 ▇▁▁▁▁
Population.aged.15.to.19.years 0 1 11782258.92 55126036.18 110 26296.50 336969.5 1626210.75 623576060 ▇▁▁▁▁
Population.aged.20.to.29.years 0 1 20872880.04 98860990.50 158 45050.75 609723.5 2758738.50 1210493200 ▇▁▁▁▁
Population.aged.30.to.39.years 0 1 17158704.11 82404600.95 137 36608.25 486290.5 2113149.00 1165207300 ▇▁▁▁▁
Population.aged.40.to.49.years 0 1 13622138.99 66008221.21 119 27440.25 364712.5 1556334.00 976407200 ▇▁▁▁▁
Population.aged.50.to.59.years 0 1 10177069.11 49288480.77 95 19649.75 264781.5 1203386.00 851356900 ▇▁▁▁▁
Population.aged.60.to.69.years 0 1 6801756.84 32712918.99 64 12603.00 168417.5 845242.75 598067140 ▇▁▁▁▁
Population.aged.70.to.79.years 0 1 3618710.03 17491538.61 31 6221.00 81824.0 436710.00 330491170 ▇▁▁▁▁
Population.aged.80.to.89.years 0 1 1195799.30 6238308.33 6 1818.75 20269.5 133380.50 131835590 ▇▁▁▁▁
Population.aged.90.to.99.years 0 1 142784.38 853350.39 0 154.75 1468.5 12499.00 22223974 ▇▁▁▁▁
Population.older.than.100.years 0 1 3107.72 20951.57 0 0.00 13.0 163.00 593166 ▇▁▁▁▁

1.4 Đổi tên các cột để thao tác

Các ký hiệu tên tương ứng theo thứ tự lần lượt từ cột 1 đến cột 24

  • Country name= ‘cn’

  • Year= ‘y’

  • Population= ‘p’

  • Population of children under the age of 1= ‘pu1’

  • Population of children under the age of 5= ‘pu5’

  • Population of children under the age of 15= ‘pu15’

  • Population under the age of 25= ‘pu25’

  • Population aged 15 to 64 years= ‘p15t64’

  • Population older than 15 years= ‘pt15’

  • Population older than 18 years= ‘pt18’

  • Population at age 1= ‘p1’

  • Population aged 1 to 4 years= ‘p1t4’

  • Population aged 5 to 9 years= ‘p5t9’

  • Population aged 10 to 14 years= ‘p10t14’

  • Population aged 15 to 19 years= ‘p15t19’

  • Population aged 20 to 29 years= ‘p20t29’

  • Population aged 30 to 39 years= ‘p30t39’

  • Population aged 40 to 49 years= ‘p40t49’

  • Population aged 50 to 59 years= ‘p50t59’

  • Population aged 60 to 69 years= ‘p60t69’

  • Population aged 70 to 79 years= ‘p70t79’

  • Population aged 80 to 89 years= ‘p80t89’

  • Population aged 90 to 99 years= ‘p90t99’

  • Population older than 100 years= ‘pt100’

names(d) = c('cn','y','p','pu1','pu5','pu15','pu25','p15t64','pt15','pt18','p1','p1t4','p5t9','p10t14','p15t19','p20t29','p30t39','p40t49','p50t59','p60t69','p70t79','p80t89','p90t99','pt100')
names(d)
##  [1] "cn"     "y"      "p"      "pu1"    "pu5"    "pu15"   "pu25"   "p15t64"
##  [9] "pt15"   "pt18"   "p1"     "p1t4"   "p5t9"   "p10t14" "p15t19" "p20t29"
## [17] "p30t39" "p40t49" "p50t59" "p60t69" "p70t79" "p80t89" "p90t99" "pt100"

1.5 Rút trích dữ liệu

Việc rút trích dữ liệu theo ý muốn cũng như phần dữ liệu được rút sẽ giúp việc tìm hiểu trở nên tối ưu hơn, để chắc chắn đã rút trích thành công ta dùng lệnh str(x) với x là tên object mà ta gán dữ liệu để có thể xem các đối tượng và số lượng của biến của x

Chọn ra 6 cột tương ứng là “cn”,“y”,“p”,“pu5”,“pu15”,“pu25”,“pt18”,“pt100” và chọn những hàng bắt đầu bằng chữ “A” gán vào object d1. Kết quả trả về là d1 gồm có 6 cột và 1152 giá trị

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
library(stringr)
d1 <- select(d,cn,y,p,pu5,pu15,pu25,pt18,pt100) %>% filter(str_detect(cn, "^A"))
str(d1)
## 'data.frame':    1152 obs. of  8 variables:
##  $ cn   : chr  "Afghanistan" "Afghanistan" "Afghanistan" "Afghanistan" ...
##  $ y    : int  1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 ...
##  $ p    : num  7480464 7571542 7667534 7764549 7864289 ...
##  $ pu5  : int  1248282 1246857 1248220 1254725 1267817 1291129 1322342 1354752 1387274 1421808 ...
##  $ pu15 : int  3068855 3105444 3145070 3186382 3231060 3281470 3337026 3396048 3455343 3518528 ...
##  $ pu25 : num  4494349 4552138 4613604 4676232 4741371 ...
##  $ pt18 : num  3946595 3993640 4041439 4088379 4136116 ...
##  $ pt100: num  0 0 0 0 0 0 0 0 0 0 ...

1.6 Mã hoá dữ liệu

Câu lệnh biểu thị một điều kiện so sánh trên cột pt100 của bảng dữ liệu d1. Cụ thể:

  • Nếu giá trị trong cột pt100 của hàng nào đó bằng 0 (d1$pt100 == 0 đúng), thì giá trị của cột pt100 trong hàng đó sẽ được thay thế bằng chuỗi ‘Khong Co’.
  • Nếu giá trị trong cột pt100 của hàng nào đó không bằng 0 (d1$pt100 == 0 sai), thì giá trị của cột pt100 trong hàng đó sẽ được thay thế bằng chuỗi ‘Co’
d1$pt100.phanloai <- ifelse(d1$pt100 == 0, 'Khong Co', 'Co')
str(d1)
## 'data.frame':    1152 obs. of  9 variables:
##  $ cn            : chr  "Afghanistan" "Afghanistan" "Afghanistan" "Afghanistan" ...
##  $ y             : int  1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 ...
##  $ p             : num  7480464 7571542 7667534 7764549 7864289 ...
##  $ pu5           : int  1248282 1246857 1248220 1254725 1267817 1291129 1322342 1354752 1387274 1421808 ...
##  $ pu15          : int  3068855 3105444 3145070 3186382 3231060 3281470 3337026 3396048 3455343 3518528 ...
##  $ pu25          : num  4494349 4552138 4613604 4676232 4741371 ...
##  $ pt18          : num  3946595 3993640 4041439 4088379 4136116 ...
##  $ pt100         : num  0 0 0 0 0 0 0 0 0 0 ...
##  $ pt100.phanloai: chr  "Khong Co" "Khong Co" "Khong Co" "Khong Co" ...

Lệnh d1\(p.cut <- cut(d1\)p, 3, labels = c(‘It’, ‘Trung Binh’, ‘Nhieu’)) trong R được sử dụng để tạo một biến mới (p.cut) trong bảng dữ liệu d1 bằng cách chia biến hiện tại p thành các khoảng và gắn tên cho mỗi khoảng dựa trên giá trị của nó. Cụ thể:

  • d1$p là biến bạn đang muốn chia thành các khoảng.

  • 3 là số lượng khoảng bạn muốn tạo.

  • labels = c(‘It’, ‘Trung Binh’, ‘Nhieu’) là nhãn tương ứng với mỗi khoảng.

Kết quả là, biến mới p.cut sẽ chứa các tên tương ứng với khoảng mà giá trị của p thuộc vào. Nó tạo ra một biến phân loại dựa trên giá trị của biến số p.

d1$p.cut <- cut(d1$p,3,labels = c('It','Trung Binh','Nhieu'))
str(d1)
## 'data.frame':    1152 obs. of  10 variables:
##  $ cn            : chr  "Afghanistan" "Afghanistan" "Afghanistan" "Afghanistan" ...
##  $ y             : int  1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 ...
##  $ p             : num  7480464 7571542 7667534 7764549 7864289 ...
##  $ pu5           : int  1248282 1246857 1248220 1254725 1267817 1291129 1322342 1354752 1387274 1421808 ...
##  $ pu15          : int  3068855 3105444 3145070 3186382 3231060 3281470 3337026 3396048 3455343 3518528 ...
##  $ pu25          : num  4494349 4552138 4613604 4676232 4741371 ...
##  $ pt18          : num  3946595 3993640 4041439 4088379 4136116 ...
##  $ pt100         : num  0 0 0 0 0 0 0 0 0 0 ...
##  $ pt100.phanloai: chr  "Khong Co" "Khong Co" "Khong Co" "Khong Co" ...
##  $ p.cut         : Factor w/ 3 levels "It","Trung Binh",..: 1 1 1 1 1 1 1 1 1 1 ...

1.7 Lập bảng tần số

Lập bảng tần sô 1 biến

  • Bảng tần số có 72 mức giá (1d), được đánh số từ 1 đến 72, tương ứng với mỗi năm từ 1950 đến …

  • Số lần xuất hiện ở mỗi mức giá là 16.

  • Attribue “dimnames” mô tả các tên của mỗi mức giá, và chúng được hiển thị dưới dạng chuỗi năm, ví dụ: “1950”, “1951”, “1952”, …

d2 <- table(d1$y)
str(d2)
##  'table' int [1:72(1d)] 16 16 16 16 16 16 16 16 16 16 ...
##  - attr(*, "dimnames")=List of 1
##   ..$ : chr [1:72] "1950" "1951" "1952" "1953" ...

Lập bảng tần số 2 biến

Dưới đây là mô tả chi tiết:

  • Bảng tần số có 72 hàng (1:72) và 3 cột (1:3).

  • Chiều thứ nhất (hàng) đại diện cho năm, được đánh số từ 1 đến 72, tương ứng với mỗi năm từ 1950 đến …

  • Chiều thứ hai (cột) đại diện cho các nhóm hoặc mức độ (It, Trung Binh, Nhieu).

  • Mỗi ô trong bảng chứa số lần xuất hiện tương ứng với năm và nhóm tương ứng.

Attribute “dimnames” bao gồm hai danh sách:

  • Danh sách đầu tiên (chiều hàng) chứa tên của mỗi năm, ví dụ: “1950”, “1951”, “1952”, …

  • Danh sách thứ hai (chiều cột) chứa tên của mỗi nhóm, ví dụ: “It”, “Trung Binh”, “Nhieu”.

d3 <- table(d1$y,d1$p.cut)
str(d3)
##  'table' int [1:72, 1:3] 16 16 16 16 16 16 15 15 15 15 ...
##  - attr(*, "dimnames")=List of 2
##   ..$ : chr [1:72] "1950" "1951" "1952" "1953" ...
##   ..$ : chr [1:3] "It" "Trung Binh" "Nhieu"

1.8 Phân tích dữ liệu theo quốc gia và thời gian

Phân tích dân số trung bình theo từng nhóm quốc gia Lệnh d4 <- d1 %>% group_by(y) %>% summarise(mean_of_population = mean(p)) trong R sử dụng gói dplyr để thực hiện một phép tổng hợp dữ liệu trên cột “cn” của bảng dữ liệu “d1” theo nhóm “y”. Dưới đây là giải thích chi tiết:

  • group_by(y): Nhóm dữ liệu theo cột “y”. Điều này có nghĩa là các phép tổng hợp tiếp theo sẽ được thực hiện cho từng nhóm “y” riêng biệt.

  • summarise(mean_of_population = mean(p)): Tính trung bình của cột “p” cho mỗi nhóm “cn” và tạo ra một cột mới có tên “mean_of_population” để lưu trữ kết quả.

Kết quả trả về:

  • Cột “cn”: Chứa tên quốc gia (cột “cn” trong bảng dữ liệu).

  • Cột “mean_of_population” chứa giá trị trung bình của cột “p” cho từng năm.

d4 <- d1 %>% group_by(cn) %>% summarise(mean_of_population = mean(p))
str(d4)
## tibble [16 × 2] (S3: tbl_df/tbl/data.frame)
##  $ cn                : chr [1:16] "Afghanistan" "Africa (UN)" "Albania" "Algeria" ...
##  $ mean_of_population: num [1:16] 1.66e+07 6.43e+08 2.63e+06 2.35e+07 3.92e+04 ...

Phân tích và tổng hợp số trẻ em dưới 15 tuổi theo nhóm quốc gia và năm Kết quả trả về có 1,152 dòng và 4 cột:

  • Cột “cn”: Chứa tên quốc gia (cột “cn” trong bảng dữ liệu).
  • Cột “y”: Chứa năm (cột “y” trong bảng dữ liệu).
  • Cột “n”: Chứa số lượng (số lần xuất hiện) của mỗi cặp giá trị “cn” và “y”.
  • Cột “sum_of_pu15”: Chứa tổng giá trị của cột “pu15” cho mỗi cặp giá trị “cn” và “y”
d5 <- d1 %>% group_by(cn,y) %>% summarise(n = n(),sum_of_pu15 = sum(pu15),.groups = 'drop')
str(d5)
## tibble [1,152 × 4] (S3: tbl_df/tbl/data.frame)
##  $ cn         : chr [1:1152] "Afghanistan" "Afghanistan" "Afghanistan" "Afghanistan" ...
##  $ y          : int [1:1152] 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 ...
##  $ n          : int [1:1152] 1 1 1 1 1 1 1 1 1 1 ...
##  $ sum_of_pu15: int [1:1152] 3068855 3105444 3145070 3186382 3231060 3281470 3337026 3396048 3455343 3518528 ...

2 Nhiệm vụ 3.2:Rural population female.xlsx

2.1 Giới thiệu:

Nhiệm vụ 3.2 tiến hành thao tác 1 số lệnh cơ bản trên dataset “Rural population female.xlsx”. Dataset thống kê dân số là nữ ở các nước trên thế giới.Với 5 biến trong đó có 2 biến định tính và 3 biến định lượng Dùng phần mềm R để thao tác

2.2 Mô tả cơ bản datasets

  • Là một data frame
  • Có 5 cột tương ứng với 5 giá trị
  • Có 239 hàng tương ứng với 239 quan sát
  • Dataset không có dữ liệu trống
  • Ký hiệu các cột là:
    • Country name: Tên quốc gia
    • Country Code: Mã quốc gia
    • 1990: số lượng phụ nữ ở các nước trên thế giới năm 1990
    • 2000: số lượng phụ nữ ở các nước trên thế giới năm 2000
    • 2015: số lượng phụ nữ ở các nước trên thế giới năm 2015

Thực hiện thao tác đọc và gán dữ liệu vào máy. Sau thao tác này thì dữ liệu từ file “Rural population female.xlsx” đã được gán vào m như bên dưới

#Đọc dữ liệu từ file csv và gán vào object m
library(xlsx)
m <- read.xlsx("D:/KTLR/Rural population female ( of total).xlsx", sheetIndex = 1, header = 1)

Kiểm tra xem “m” có phải là data frame hay không, nếu đúng thì true và ngược lại. Và kết quả trả về là TRUE > m là một dataframe

is.data.frame(m)
## [1] TRUE

Xác định số hàng, số cột của m dưới dạng vecto. Kết quả trả về thì m tương ứng có 239 hàng và 5 cột

dim(m)
## [1] 239   5

Xác định số ô trống của m. Kết quả trả về tương ứng với m không có ô trống nào

sum(is.na(m))
## [1] 0

2.3 Thống kê dữ liệu

Thực hiện thống kê mô tả dataset này ta được kết quả bên dưới, ý nghĩa các cột như sau:

  • n_missing: số ô dữ liệu bị miss(trống)

  • complete_rate: tỷ lệ ô có dữ liệu

  • mean: trung bình

  • sd: độ lệch chuẩn

  • p0: giá trị nhỏ nhất

  • p25: Phân vị thứ nhất

  • p50: Phân vị thứ hai cũng chính là trung vị

  • p75: phân vị thứ ba

  • p100: giá trị lớn nhất

  • hist: biểu đồ Histogram

Xác định các thông tin cơ bản trong m

library(skimr)
skim(m)
Data summary
Name m
Number of rows 239
Number of columns 5
_______________________
Column type frequency:
character 3
numeric 2
________________________
Group variables None

Variable type: character

skim_variable n_missing complete_rate min max empty n_unique whitespace
Country.Name 0 1 4 50 0 239 0
Country.Code 0 1 3 3 0 239 0
X2015 0 1 1 11 0 237 0

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
X1990 0 1 25.76 11.53 0.22 15.95 25.90 35.64 48.30 ▂▆▆▇▃
X2000 0 1 24.31 11.36 0.00 15.06 24.79 34.35 46.88 ▃▆▆▇▃

2.4 Đổi tên các cột để thao tác

Các ký hiệu tên tương ứng theo thứ tự lần lượt từ cột 1 đến cột 24

  • Country name= ‘cn’
  • Country Code= ‘cc’
  • 1990= ‘a1’
  • 2000= ‘a2’
  • 2015= ‘a3’
names(m) = c('cn','cc','a1','a2','a3')
names(m)
## [1] "cn" "cc" "a1" "a2" "a3"

2.5 Rút trích dữ liệu

Việc rút trích dữ liệu theo ý muốn cũng như phần dữ liệu được rút sẽ giúp việc tìm hiểu trở nên tối ưu hơn, để chắc chắn đã rút trích thành công ta dùng lệnh str(x) với x là tên object mà ta gán dữ liệu để có thể xem các đối tượng và số lượng của biến của x

Chọn ra 4 cột tương ứng là “cn”,“a1”,“a2”,“a3” và chọn những hàng bắt đầu bằng chữ “A” gán vào object m1. Kết quả trả về là m1 gồm có 4 cột và 14 giá trị

library(dplyr)
library(stringr)
m1 <- select(m,cn,a1,a2,a3) %>% filter(str_detect(cn, "^A"))
str(m1)
## 'data.frame':    14 obs. of  4 variables:
##  $ cn: chr  "Afghanistan" "Albania" "Algeria" "Angola" ...
##  $ a1: num  39.8 30.8 23.7 38.2 32.3 ...
##  $ a2: num  38.7 29 19.8 34.8 35.9 ...
##  $ a3: chr  "36.1577155" "21.05757196" "14.37255433" "28.74671341" ...

2.6 Mã hoá dữ liệu

Câu lệnh biểu thị một điều kiện so sánh trên cột a3 của bảng dữ liệu m1. Cụ thể: - Nếu giá trị trong cột a3 của hàng nào đó bằng 0 (m1\(a3 == 0 đúng), thì giá trị của cột a3 trong hàng đó sẽ được thay thế bằng chuỗi 'Khong Co'. - Nếu giá trị trong cột a3 của hàng nào đó không bằng 0 (m1\)a3 == 0 sai), thì giá trị của cột a3 trong hàng đó sẽ được thay thế bằng chuỗi ‘Co’

m1$a3.phanloai <- ifelse(m1$a3 == 0, 'Khong Co', 'Co')
str(m1)
## 'data.frame':   14 obs. of  5 variables:
##  $ cn         : chr  "Afghanistan" "Albania" "Algeria" "Angola" ...
##  $ a1         : num  39.8 30.8 23.7 38.2 32.3 ...
##  $ a2         : num  38.7 29 19.8 34.8 35.9 ...
##  $ a3         : chr  "36.1577155" "21.05757196" "14.37255433" "28.74671341" ...
##  $ a3.phanloai: chr  "Co" "Co" "Co" "Co" ...

2.7 Lập bảng tần số

LS0tDQp0aXRsZTogIk5oaeG7h20gduG7pSAzIg0KYXV0aG9yOiBMw6JtIFRo4bqjbyBNeSANCmRhdGU6ICJgciBmb3JtYXQoU3lzLnRpbWUoKSwgJyVIOiVNOiVTLCAlZCAtICVtIC0gJVknKWAiDQpvdXRwdXQ6IA0KICBodG1sX2RvY3VtZW50Og0KICAgIG51bWJlcl9zZWN0aW9uczogeWVzDQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIHRoZW1lOiAiZGVmYXVsdCINCiAgICB0b2M6IFRSVUUNCiAgICB0b2NfZmxvYXQ6IFRSVUUNCiAgICB0b2NfZGVwdGg6IDINCi0tLQ0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpDQpgYGANCg0KIyBOaGnhu4dtIHbhu6UgMy4xOiBwb3B1bGF0aW9uLWFuZC1kZW1vZ3JhcGh5DQoNCiMjIEdp4bubaSB0aGnhu4d1OiANCk5oaeG7h20gduG7pSAzLjEgdGnhur9uIGjDoG5oIHRoYW8gdMOhYyAxIHPhu5EgbOG7h25oIGPGoSBi4bqjbiB0csOqbiBkYXRhc2V0IOKAnHBvcHVsYXRpb24tYW5kLWRlbW9ncmFwaHkuY3N24oCdLiBEYXRhc2V0IHRo4buRbmcga8OqIGTDom4gc+G7kSB2w6AgZMOibiBz4buRIHRoZW8gdOG7q25nIMSR4buZIHR14buVaSBraMOhYyBuaGF1IGPhu6dhIGPDoWMgbsaw4bubYyBraMOhYyBuaGF1LiBEw7luZyBwaOG6p24gbeG7gW0gUiDEkeG7gyB0aGFvIHTDoWMNCg0KIyMgTcO0IHThuqMgY8ahIGLhuqNuIGRhdGFzZXRzDQotIEzDoCBt4buZdCBkYXRhIGZyYW1lDQotIEPDsyAyNCBj4buZdCB0xrDGoW5nIOG7qW5nIHbhu5tpIDI0IGdpw6EgdHLhu4sNCi0gQ8OzIDE4Mjg4IGjDoG5nIHTGsMahbmcg4bupbmcgduG7m2kgMTgyODggcXVhbiBzw6F0DQotIERhdGFzZXQga2jDtG5nIGPDsyBk4buvIGxp4buHdSB0cuG7kW5nIA0KLSBLw70gaGnhu4d1IGPDoWMgY+G7mXQgbMOgOg0KICAtIENvdW50cnkgbmFtZTogVMOqbiBxdeG7kWMgZ2lhDQogIC0gWWVhcjogTsSDbQ0KICAtIFBvcHVsYXRpb246IETDom4gc+G7kQ0KICAtIFBvcHVsYXRpb24gb2YgY2hpbGRyZW4gdW5kZXIgdGhlIGFnZSBvZiAxOiBEw6JuIHPhu5EgY+G7p2EgdHLhursgZW0gZMaw4bubaSAxIHR14buVaQ0KICAtIFBvcHVsYXRpb24gb2YgY2hpbGRyZW4gdW5kZXIgdGhlIGFnZSBvZiA1OiBEw6JuIHPhu5EgY+G7p2EgdHLhursgZW0gZMaw4bubaSA1IHR14buVaQ0KICAtIFBvcHVsYXRpb24gb2YgY2hpbGRyZW4gdW5kZXIgdGhlIGFnZSBvZiAxNTogRMOibiBz4buRIGPhu6dhIHRy4bq7IGVtIGTGsOG7m2kgMTUgdHXhu5VpDQogIC0gUG9wdWxhdGlvbiB1bmRlciB0aGUgYWdlIG9mIDI1OiBEw6JuIHPhu5EgZMaw4bubaSAyNSB0deG7lWkNCiAgLSBQb3B1bGF0aW9uIGFnZWQgMTUgdG8gNjQgeWVhcnM6IETDom4gc+G7kSB04burIDE1IMSR4bq/biA2NCB0deG7lWkNCiAgLSBQb3B1bGF0aW9uIG9sZGVyIHRoYW4gMTUgeWVhcnM6IETDom4gc+G7kSB0csOqbiAxNSB0deG7lWkNCiAgLSBQb3B1bGF0aW9uIG9sZGVyIHRoYW4gMTggeWVhcnM6IETDom4gc+G7kSB0csOqbiAxOCB0deG7lWkNCiAgLSBQb3B1bGF0aW9uIGF0IGFnZSAxOiBEw6JuIHPhu5EgdOG6oWkgbMO6YyAxIHR14buVaQ0KICAtIFBvcHVsYXRpb24gYWdlZCAxIHRvIDQgeWVhcnM6IETDom4gc+G7kSB04burIDEgxJHhur9uIDQgdHXhu5VpDQogIC0gUG9wdWxhdGlvbiBhZ2VkIDUgdG8gOSB5ZWFyczogRMOibiBzw7QgdOG7qyA1IMSR4bq/biA5IHR14buVaQ0KICAtIFBvcHVsYXRpb24gYWdlZCAxMCB0byAxNCB5ZWFyczogRMOibiBz4buRIHThu6sgMTAgxJHhur9uIDE0IHR14buVaQ0KICAtIFBvcHVsYXRpb24gYWdlZCAxNSB0byAxOSB5ZWFyczogRMOibiBz4buRIHThu6sgMTUgxJHhur9uIDE5IHR14buVaQ0KICAtIFBvcHVsYXRpb24gYWdlZCAyMCB0byAyOSB5ZWFyczogRMOibiBz4buRIHThu6sgMjAgxJHhur9uIDI5IHR14buVaQ0KICAtIFBvcHVsYXRpb24gYWdlZCAzMCB0byAzOSB5ZWFyczogRMOibiBz4buRIHThu6sgMzAgxJHhur9uIDM5IHR14buVaQ0KICAtIFBvcHVsYXRpb24gYWdlZCA0MCB0byA0OSB5ZWFyczogRMOibiBz4buRIHThu6sgNDAgxJHhur9uIDQ5IHR14buVaQ0KICAtIFBvcHVsYXRpb24gYWdlZCA1MCB0byA1OSB5ZWFyczogRMOibiBz4buRIHThu6sgNTAgxJHhur9uIDU5IHR14buVaQ0KICAtIFBvcHVsYXRpb24gYWdlZCA2MCB0byA2OSB5ZWFyczogRMOibiBz4buRIHThu6sgNjAgxJHhur9uIDY5IHR14buVaQ0KICAtIFBvcHVsYXRpb24gYWdlZCA3MCB0byA3OSB5ZWFyczogRMOibiBz4buRIHThu6sgNzAgxJHhur9uIDc5IHR14buVaQ0KICAtIFBvcHVsYXRpb24gYWdlZCA4MCB0byA4OSB5ZWFyczogRMOibiBz4buRIHThu6sgODAgxJHhur9uIDg5IHR14buVaQ0KICAtIFBvcHVsYXRpb24gYWdlZCA5MCB0byA5OSB5ZWFyczogRMOibiBz4buRIHThu6sgOTAgxJHhur9uIDk5IHR14buVaQ0KICAtIFBvcHVsYXRpb24gb2xkZXIgdGhhbiAxMDAgeWVhcnM6IETDom4gc+G7kSB0csOqbiAxMDAgdHXhu5VpDQoNClRo4buxYyBoaeG7h24gdGhhbyB0w6FjIMSR4buNYyB2w6AgZ8OhbiBk4buvIGxp4buHdSB2w6BvIG3DoXkuIFNhdSB0aGFvIHTDoWMgbsOgeSB0aMOsIGThu68gbGnhu4d1IHThu6sgZmlsZSAicG9wdWxhdGlvbi1hbmQtZGVtb2dyYXBoeS5jc3YiIMSRw6MgxJHGsOG7o2MgZ8OhbiB2w6BvIGQgbmjGsCBiw6puIGTGsOG7m2kNCmBgYHtyfQ0KI8SQ4buNYyBk4buvIGxp4buHdSB04burIGZpbGUgY3N2IHbDoCBnw6FuIHbDoG8gb2JqZWN0IGQNCmQgPC0gcmVhZC5jc3YoIkQ6XFxLVExSXFxwb3B1bGF0aW9uLWFuZC1kZW1vZ3JhcGh5LmNzdiIpDQpgYGANCg0KS2nhu4NtIHRyYSB4ZW0gImQiIGPDsyBwaOG6o2kgbMOgIGRhdGEgZnJhbWUgaGF5IGtow7RuZywgbuG6v3UgxJHDum5nIHRow6wgdHJ1ZSB2w6AgbmfGsOG7o2MgbOG6oWkuIFbDoCBr4bq/dCBxdeG6oyB0cuG6oyB24buBIGzDoCBUUlVFID4gZCBsw6AgbeG7mXQgZGF0YWZyYW1lDQpgYGB7cn0NCmlzLmRhdGEuZnJhbWUoZCkgDQpgYGANCg0KDQpYw6FjIMSR4buLbmggc+G7kSBow6BuZywgc+G7kSBj4buZdCBj4bunYSBkIGTGsOG7m2kgZOG6oW5nIHZlY3RvLiBL4bq/dCBxdeG6oyB0cuG6oyB24buBIHRow6wgZCB0xrDGoW5nIOG7qW5nIGPDsyAxODI4OCBow6BuZyB2w6AgMjQgY+G7mXQNCmBgYHtyfQ0KZGltKGQpDQpgYGANCg0KWMOhYyDEkeG7i25oIHPhu5Egw7QgdHLhu5FuZyBj4bunYSBkLiBL4bq/dCBxdeG6oyB0cuG6oyB24buBIHTGsMahbmcg4bupbmcgduG7m2kgZCBraMO0bmcgY8OzIMO0IHRy4buRbmcgbsOgbw0KYGBge3J9DQpzdW0oaXMubmEoZCkpDQpgYGANCg0KIyMgVGjhu5FuZyBrw6ogZOG7ryBsaeG7h3UNClRo4buxYyBoaeG7h24gdGjhu5FuZyBrw6ogbcO0IHThuqMgZGF0YXNldCBuw6B5IHRhIMSRxrDhu6NjIGvhur90IHF14bqjIGLDqm4gZMaw4bubaSwgw70gbmdoxKlhIGPDoWMgY+G7mXQgbmjGsCBzYXU6DQoNCiAtIG5fbWlzc2luZzogc+G7kSDDtCBk4buvIGxp4buHdSBi4buLIG1pc3ModHLhu5FuZykNCg0KIC0gY29tcGxldGVfcmF0ZTogdOG7tyBs4buHIMO0IGPDsyBk4buvIGxp4buHdQ0KDQogLSBtZWFuOiB0cnVuZyBiw6xuaA0KDQogLSBzZDogxJHhu5kgbOG7h2NoIGNodeG6qW4NCg0KIC0gcDA6IGdpw6EgdHLhu4sgbmjhu48gbmjhuqV0DQoNCiAtIHAyNTogUGjDom4gduG7iyB0aOG7qSBuaOG6pXQNCg0KIC0gcDUwOiBQaMOibiB24buLIHRo4bupIGhhaSBjxaluZyBjaMOtbmggbMOgIHRydW5nIHbhu4sNCg0KIC0gcDc1OiBwaMOibiB24buLIHRo4bupIGJhDQoNCiAtIHAxMDA6IGdpw6EgdHLhu4sgbOG7m24gbmjhuqV0DQoNCiAtIGhpc3Q6IGJp4buDdSDEkeG7kyBIaXN0b2dyYW0NCg0KWMOhYyDEkeG7i25oIGPDoWMgdGjDtG5nIHRpbiBjxqEgYuG6o24gdHJvbmcgZA0KYGBge3J9DQpsaWJyYXJ5KHNraW1yKQ0Kc2tpbShkKQ0KYGBgDQoNCiMjIMSQ4buVaSB0w6puIGPDoWMgY+G7mXQgxJHhu4MgdGhhbyB0w6FjDQpDw6FjIGvDvSBoaeG7h3UgdMOqbiB0xrDGoW5nIOG7qW5nIHRoZW8gdGjhu6kgdOG7sSBs4bqnbiBsxrDhu6N0IHThu6sgY+G7mXQgMSDEkeG6v24gY+G7mXQgMjQNCg0KICAtIENvdW50cnkgbmFtZT0gJ2NuJw0KICANCiAgLSBZZWFyPSAneScNCiAgDQogIC0gUG9wdWxhdGlvbj0gJ3AnDQogIA0KICAtIFBvcHVsYXRpb24gb2YgY2hpbGRyZW4gdW5kZXIgdGhlIGFnZSBvZiAxPSAncHUxJw0KICANCiAgLSBQb3B1bGF0aW9uIG9mIGNoaWxkcmVuIHVuZGVyIHRoZSBhZ2Ugb2YgNT0gJ3B1NScNCiAgDQogIC0gUG9wdWxhdGlvbiBvZiBjaGlsZHJlbiB1bmRlciB0aGUgYWdlIG9mIDE1PSAncHUxNScNCiAgDQogIC0gUG9wdWxhdGlvbiB1bmRlciB0aGUgYWdlIG9mIDI1PSAncHUyNScNCiAgDQogIC0gUG9wdWxhdGlvbiBhZ2VkIDE1IHRvIDY0IHllYXJzPSAncDE1dDY0Jw0KICANCiAgLSBQb3B1bGF0aW9uIG9sZGVyIHRoYW4gMTUgeWVhcnM9ICdwdDE1Jw0KICANCiAgLSBQb3B1bGF0aW9uIG9sZGVyIHRoYW4gMTggeWVhcnM9ICdwdDE4Jw0KICANCiAgLSBQb3B1bGF0aW9uIGF0IGFnZSAxPSAncDEnDQogIA0KICAtIFBvcHVsYXRpb24gYWdlZCAxIHRvIDQgeWVhcnM9ICdwMXQ0Jw0KICANCiAgLSBQb3B1bGF0aW9uIGFnZWQgNSB0byA5IHllYXJzPSAncDV0OScNCiAgDQogIC0gUG9wdWxhdGlvbiBhZ2VkIDEwIHRvIDE0IHllYXJzPSAncDEwdDE0Jw0KICANCiAgLSBQb3B1bGF0aW9uIGFnZWQgMTUgdG8gMTkgeWVhcnM9ICdwMTV0MTknDQogIA0KICAtIFBvcHVsYXRpb24gYWdlZCAyMCB0byAyOSB5ZWFycz0gJ3AyMHQyOScNCiAgDQogIC0gUG9wdWxhdGlvbiBhZ2VkIDMwIHRvIDM5IHllYXJzPSAncDMwdDM5Jw0KICANCiAgLSBQb3B1bGF0aW9uIGFnZWQgNDAgdG8gNDkgeWVhcnM9ICdwNDB0NDknDQogIA0KICAtIFBvcHVsYXRpb24gYWdlZCA1MCB0byA1OSB5ZWFycz0gJ3A1MHQ1OScNCiAgDQogIC0gUG9wdWxhdGlvbiBhZ2VkIDYwIHRvIDY5IHllYXJzPSAncDYwdDY5Jw0KICANCiAgLSBQb3B1bGF0aW9uIGFnZWQgNzAgdG8gNzkgeWVhcnM9ICdwNzB0NzknDQogIA0KICAtIFBvcHVsYXRpb24gYWdlZCA4MCB0byA4OSB5ZWFycz0gJ3A4MHQ4OScNCiAgDQogIC0gUG9wdWxhdGlvbiBhZ2VkIDkwIHRvIDk5IHllYXJzPSAncDkwdDk5Jw0KICANCiAgLSBQb3B1bGF0aW9uIG9sZGVyIHRoYW4gMTAwIHllYXJzPSAncHQxMDAnDQoNCmBgYHtyfQ0KbmFtZXMoZCkgPSBjKCdjbicsJ3knLCdwJywncHUxJywncHU1JywncHUxNScsJ3B1MjUnLCdwMTV0NjQnLCdwdDE1JywncHQxOCcsJ3AxJywncDF0NCcsJ3A1dDknLCdwMTB0MTQnLCdwMTV0MTknLCdwMjB0MjknLCdwMzB0MzknLCdwNDB0NDknLCdwNTB0NTknLCdwNjB0NjknLCdwNzB0NzknLCdwODB0ODknLCdwOTB0OTknLCdwdDEwMCcpDQpuYW1lcyhkKQ0KYGBgDQoNCiMjIFLDunQgdHLDrWNoIGThu68gbGnhu4d1DQpWaeG7h2MgcsO6dCB0csOtY2ggZOG7ryBsaeG7h3UgdGhlbyDDvSBtdeG7kW4gY8WpbmcgbmjGsCBwaOG6p24gZOG7ryBsaeG7h3UgxJHGsOG7o2MgcsO6dCBz4bq9IGdpw7pwIHZp4buHYyB0w6xtIGhp4buDdSB0cuG7nyBuw6puIHThu5FpIMawdSBoxqFuLCDEkeG7gyBjaOG6r2MgY2jhuq9uIMSRw6MgcsO6dCB0csOtY2ggdGjDoG5oIGPDtG5nIHRhIGTDuW5nIGzhu4duaCBzdHIoeCkgduG7m2kgeCBsw6AgdMOqbiBvYmplY3QgbcOgIHRhIGfDoW4gZOG7ryBsaeG7h3UgxJHhu4MgY8OzIHRo4buDIHhlbSBjw6FjIMSR4buRaSB0xrDhu6NuZyB2w6Agc+G7kSBsxrDhu6NuZyBj4bunYSBiaeG6v24gY+G7p2EgeA0KDQpDaOG7jW4gcmEgNiBj4buZdCB0xrDGoW5nIOG7qW5nIGzDoCAiY24iLCJ5IiwicCIsInB1NSIsInB1MTUiLCJwdTI1IiwicHQxOCIsInB0MTAwIiB2w6AgY2jhu41uIG5o4buvbmcgaMOgbmcgYuG6r3QgxJHhuqd1IGLhurFuZyBjaOG7ryAiQSIgZ8OhbiB2w6BvIG9iamVjdCBkMS4gS+G6v3QgcXXhuqMgdHLhuqMgduG7gSBsw6AgZDEgZ+G7k20gY8OzIDYgY+G7mXQgdsOgIDExNTIgZ2nDoSB0cuG7iw0KYGBge3J9DQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShzdHJpbmdyKQ0KZDEgPC0gc2VsZWN0KGQsY24seSxwLHB1NSxwdTE1LHB1MjUscHQxOCxwdDEwMCkgJT4lIGZpbHRlcihzdHJfZGV0ZWN0KGNuLCAiXkEiKSkNCnN0cihkMSkNCmBgYA0KIyMgTcOjIGhvw6EgZOG7ryBsaeG7h3UNCg0KQ8OidSBs4buHbmggYmnhu4N1IHRo4buLIG3hu5l0IMSRaeG7gXUga2nhu4duIHNvIHPDoW5oIHRyw6puIGPhu5l0IHB0MTAwIGPhu6dhIGLhuqNuZyBk4buvIGxp4buHdSBkMS4gQ+G7pSB0aOG7gzoNCg0KIC0gTuG6v3UgZ2nDoSB0cuG7iyB0cm9uZyBj4buZdCBwdDEwMCBj4bunYSBow6BuZyBuw6BvIMSRw7MgYuG6sW5nIDAgKGQxJHB0MTAwID09IDAgxJHDum5nKSwgdGjDrCBnacOhIHRy4buLIGPhu6dhIGPhu5l0IHB0MTAwIHRyb25nIGjDoG5nIMSRw7Mgc+G6vSDEkcaw4bujYyB0aGF5IHRo4bq/IGLhurFuZyBjaHXhu5dpICdLaG9uZyBDbycuDQogLSBO4bq/dSBnacOhIHRy4buLIHRyb25nIGPhu5l0IHB0MTAwIGPhu6dhIGjDoG5nIG7DoG8gxJHDsyBraMO0bmcgYuG6sW5nIDAgKGQxJHB0MTAwID09IDAgc2FpKSwgdGjDrCBnacOhIHRy4buLIGPhu6dhIGPhu5l0IHB0MTAwIHRyb25nIGjDoG5nIMSRw7Mgc+G6vSDEkcaw4bujYyB0aGF5IHRo4bq/IGLhurFuZyBjaHXhu5dpICdDbycNCg0KYGBge3J9DQpkMSRwdDEwMC5waGFubG9haSA8LSBpZmVsc2UoZDEkcHQxMDAgPT0gMCwgJ0tob25nIENvJywgJ0NvJykNCnN0cihkMSkNCmBgYA0KTOG7h25oIGQxJHAuY3V0IDwtIGN1dChkMSRwLCAzLCBsYWJlbHMgPSBjKCdJdCcsICdUcnVuZyBCaW5oJywgJ05oaWV1JykpIHRyb25nIFIgxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4MgdOG6oW8gbeG7mXQgYmnhur9uIG3hu5tpIChwLmN1dCkgdHJvbmcgYuG6o25nIGThu68gbGnhu4d1IGQxIGLhurFuZyBjw6FjaCBjaGlhIGJp4bq/biBoaeG7h24gdOG6oWkgcCB0aMOgbmggY8OhYyBraG/huqNuZyB2w6AgZ+G6r24gdMOqbiBjaG8gbeG7l2kga2hv4bqjbmcgZOG7sWEgdHLDqm4gZ2nDoSB0cuG7iyBj4bunYSBuw7MuIEPhu6UgdGjhu4M6DQoNCiAtIGQxJHAgbMOgIGJp4bq/biBi4bqhbiDEkWFuZyBtdeG7kW4gY2hpYSB0aMOgbmggY8OhYyBraG/huqNuZy4NCiANCiAtIDMgbMOgIHPhu5EgbMaw4bujbmcga2hv4bqjbmcgYuG6oW4gbXXhu5FuIHThuqFvLg0KIA0KIC0gbGFiZWxzID0gYygnSXQnLCAnVHJ1bmcgQmluaCcsICdOaGlldScpIGzDoCBuaMOjbiB0xrDGoW5nIOG7qW5nIHbhu5tpIG3hu5dpIGtob+G6o25nLg0KDQpL4bq/dCBxdeG6oyBsw6AsIGJp4bq/biBt4bubaSBwLmN1dCBz4bq9IGNo4bupYSBjw6FjIHTDqm4gdMawxqFuZyDhu6luZyB24bubaSBraG/huqNuZyBtw6AgZ2nDoSB0cuG7iyBj4bunYSBwIHRodeG7mWMgdsOgby4gTsOzIHThuqFvIHJhIG3hu5l0IGJp4bq/biBwaMOibiBsb+G6oWkgZOG7sWEgdHLDqm4gZ2nDoSB0cuG7iyBj4bunYSBiaeG6v24gc+G7kSBwLg0KDQpgYGB7cn0NCmQxJHAuY3V0IDwtIGN1dChkMSRwLDMsbGFiZWxzID0gYygnSXQnLCdUcnVuZyBCaW5oJywnTmhpZXUnKSkNCnN0cihkMSkNCmBgYA0KIyMgTOG6rXAgYuG6o25nIHThuqduIHPhu5ENCioqTOG6rXAgYuG6o25nIHThuqduIHPDtCAxIGJp4bq/bioqDQoNCiAtIELhuqNuZyB04bqnbiBz4buRIGPDsyA3MiBt4bupYyBnacOhICgxZCksIMSRxrDhu6NjIMSRw6FuaCBz4buRIHThu6sgMSDEkeG6v24gNzIsIHTGsMahbmcg4bupbmcgduG7m2kgbeG7l2kgbsSDbSB04burIDE5NTAgxJHhur9uIC4uLg0KDQogLSBT4buRIGzhuqduIHh14bqldCBoaeG7h24g4bufIG3hu5dpIG3hu6ljIGdpw6EgbMOgIDE2Lg0KDQogLSBBdHRyaWJ1ZSAiZGltbmFtZXMiIG3DtCB04bqjIGPDoWMgdMOqbiBj4bunYSBt4buXaSBt4bupYyBnacOhLCB2w6AgY2jDum5nIMSRxrDhu6NjIGhp4buDbiB0aOG7iyBkxrDhu5tpIGThuqFuZyBjaHXhu5dpIG7Eg20sIHbDrSBk4bulOiAiMTk1MCIsICIxOTUxIiwgIjE5NTIiLCAuLi4NCg0KYGBge3J9DQpkMiA8LSB0YWJsZShkMSR5KQ0Kc3RyKGQyKQ0KYGBgDQoqKkzhuq1wIGLhuqNuZyB04bqnbiBz4buRIDIgYmnhur9uKioNCg0KRMaw4bubaSDEkcOieSBsw6AgbcO0IHThuqMgY2hpIHRp4bq/dDoNCg0KIC0gQuG6o25nIHThuqduIHPhu5EgY8OzIDcyIGjDoG5nICgxOjcyKSB2w6AgMyBj4buZdCAoMTozKS4NCg0KIC0gQ2hp4buBdSB0aOG7qSBuaOG6pXQgKGjDoG5nKSDEkeG6oWkgZGnhu4duIGNobyBuxINtLCDEkcaw4bujYyDEkcOhbmggc+G7kSB04burIDEgxJHhur9uIDcyLCB0xrDGoW5nIOG7qW5nIHbhu5tpIG3hu5dpIG7Eg20gdOG7qyAxOTUwIMSR4bq/biAuLi4NCg0KIC0gQ2hp4buBdSB0aOG7qSBoYWkgKGPhu5l0KSDEkeG6oWkgZGnhu4duIGNobyBjw6FjIG5ow7NtIGhv4bq3YyBt4bupYyDEkeG7mSAoSXQsIFRydW5nIEJpbmgsIE5oaWV1KS4NCg0KIC0gTeG7l2kgw7QgdHJvbmcgYuG6o25nIGNo4bupYSBz4buRIGzhuqduIHh14bqldCBoaeG7h24gdMawxqFuZyDhu6luZyB24bubaSBuxINtIHbDoCBuaMOzbSB0xrDGoW5nIOG7qW5nLg0KDQpBdHRyaWJ1dGUgImRpbW5hbWVzIiBiYW8gZ+G7k20gaGFpIGRhbmggc8OhY2g6DQoNCiAtIERhbmggc8OhY2ggxJHhuqd1IHRpw6puIChjaGnhu4F1IGjDoG5nKSBjaOG7qWEgdMOqbiBj4bunYSBt4buXaSBuxINtLCB2w60gZOG7pTogIjE5NTAiLCAiMTk1MSIsICIxOTUyIiwgLi4uDQogDQogLSBEYW5oIHPDoWNoIHRo4bupIGhhaSAoY2hp4buBdSBj4buZdCkgY2jhu6lhIHTDqm4gY+G7p2EgbeG7l2kgbmjDs20sIHbDrSBk4bulOiAiSXQiLCAiVHJ1bmcgQmluaCIsICJOaGlldSIuDQogDQpgYGB7cn0NCmQzIDwtIHRhYmxlKGQxJHksZDEkcC5jdXQpDQpzdHIoZDMpDQpgYGANCiMjIFBow6JuIHTDrWNoIGThu68gbGnhu4d1IHRoZW8gcXXhu5FjIGdpYSB2w6AgdGjhu51pIGdpYW4NCg0KKipQaMOibiB0w61jaCBkw6JuIHPhu5EgdHJ1bmcgYsOsbmggdGhlbyB04burbmcgbmjDs20gcXXhu5FjIGdpYSoqDQpM4buHbmggZDQgPC0gZDEgJT4lIGdyb3VwX2J5KHkpICU+JSBzdW1tYXJpc2UobWVhbl9vZl9wb3B1bGF0aW9uID0gbWVhbihwKSkgdHJvbmcgUiBz4butIGThu6VuZyBnw7NpIGRwbHlyIMSR4buDIHRo4buxYyBoaeG7h24gbeG7mXQgcGjDqXAgdOG7lW5nIGjhu6NwIGThu68gbGnhu4d1IHRyw6puIGPhu5l0ICJjbiIgY+G7p2EgYuG6o25nIGThu68gbGnhu4d1ICJkMSIgdGhlbyBuaMOzbSAieSIuIETGsOG7m2kgxJHDonkgbMOgIGdp4bqjaSB0aMOtY2ggY2hpIHRp4bq/dDoNCg0KIC0gZ3JvdXBfYnkoeSk6IE5ow7NtIGThu68gbGnhu4d1IHRoZW8gY+G7mXQgInkiLiDEkGnhu4F1IG7DoHkgY8OzIG5naMSpYSBsw6AgY8OhYyBwaMOpcCB04buVbmcgaOG7o3AgdGnhur9wIHRoZW8gc+G6vSDEkcaw4bujYyB0aOG7sWMgaGnhu4duIGNobyB04burbmcgbmjDs20gInkiIHJpw6puZyBiaeG7h3QuDQoNCiAtIHN1bW1hcmlzZShtZWFuX29mX3BvcHVsYXRpb24gPSBtZWFuKHApKTogVMOtbmggdHJ1bmcgYsOsbmggY+G7p2EgY+G7mXQgInAiIGNobyBt4buXaSBuaMOzbSAiY24iIHbDoCB04bqhbyByYSBt4buZdCBj4buZdCBt4bubaSBjw7MgdMOqbiAibWVhbl9vZl9wb3B1bGF0aW9uIiDEkeG7gyBsxrB1IHRy4buvIGvhur90IHF14bqjLg0KIA0KS+G6v3QgcXXhuqMgdHLhuqMgduG7gToNCg0KIC0gQ+G7mXQgImNuIjogQ2jhu6lhIHTDqm4gcXXhu5FjIGdpYSAoY+G7mXQgImNuIiB0cm9uZyBi4bqjbmcgZOG7ryBsaeG7h3UpLg0KIA0KIC0gQ+G7mXQgIm1lYW5fb2ZfcG9wdWxhdGlvbiIgY2jhu6lhIGdpw6EgdHLhu4sgdHJ1bmcgYsOsbmggY+G7p2EgY+G7mXQgInAiIGNobyB04burbmcgbsSDbS4NCiANCmBgYHtyfQ0KZDQgPC0gZDEgJT4lIGdyb3VwX2J5KGNuKSAlPiUgc3VtbWFyaXNlKG1lYW5fb2ZfcG9wdWxhdGlvbiA9IG1lYW4ocCkpDQpzdHIoZDQpDQpgYGANCioqUGjDom4gdMOtY2ggdsOgIHThu5VuZyBo4bujcCBz4buRIHRy4bq7IGVtIGTGsOG7m2kgMTUgdHXhu5VpIHRoZW8gbmjDs20gcXXhu5FjIGdpYSB2w6AgbsSDbSoqDQpL4bq/dCBxdeG6oyB0cuG6oyB24buBIGPDsyAxLDE1MiBkw7JuZyB2w6AgNCBj4buZdDoNCg0KIC0gQ+G7mXQgImNuIjogQ2jhu6lhIHTDqm4gcXXhu5FjIGdpYSAoY+G7mXQgImNuIiB0cm9uZyBi4bqjbmcgZOG7ryBsaeG7h3UpLg0KIC0gQ+G7mXQgInkiOiBDaOG7qWEgbsSDbSAoY+G7mXQgInkiIHRyb25nIGLhuqNuZyBk4buvIGxp4buHdSkuDQogLSBD4buZdCAibiI6IENo4bupYSBz4buRIGzGsOG7o25nIChz4buRIGzhuqduIHh14bqldCBoaeG7h24pIGPhu6dhIG3hu5dpIGPhurdwIGdpw6EgdHLhu4sgImNuIiB2w6AgInkiLg0KIC0gQ+G7mXQgInN1bV9vZl9wdTE1IjogQ2jhu6lhIHThu5VuZyBnacOhIHRy4buLIGPhu6dhIGPhu5l0ICJwdTE1IiBjaG8gbeG7l2kgY+G6t3AgZ2nDoSB0cuG7iyAiY24iIHbDoCAieSINCg0KYGBge3J9DQpkNSA8LSBkMSAlPiUgZ3JvdXBfYnkoY24seSkgJT4lIHN1bW1hcmlzZShuID0gbigpLHN1bV9vZl9wdTE1ID0gc3VtKHB1MTUpLC5ncm91cHMgPSAnZHJvcCcpDQpzdHIoZDUpDQpgYGANCg0KIyBOaGnhu4dtIHbhu6UgMy4yOlJ1cmFsIHBvcHVsYXRpb24gZmVtYWxlLnhsc3gNCg0KIyMgR2nhu5tpIHRoaeG7h3U6IA0KTmhp4buHbSB24bulIDMuMiB0aeG6v24gaMOgbmggdGhhbyB0w6FjIDEgc+G7kSBs4buHbmggY8ahIGLhuqNuIHRyw6puIGRhdGFzZXQg4oCcUnVyYWwgcG9wdWxhdGlvbiBmZW1hbGUueGxzeOKAnS4gRGF0YXNldCB0aOG7kW5nIGvDqiBkw6JuIHPhu5EgbMOgIG7hu68g4bufIGPDoWMgbsaw4bubYyB0csOqbiB0aOG6vyBnaeG7m2kuVuG7m2kgNSBiaeG6v24gdHJvbmcgxJHDsyBjw7MgMiBiaeG6v24gxJHhu4tuaCB0w61uaCB2w6AgMyBiaeG6v24gxJHhu4tuaCBsxrDhu6NuZw0KRMO5bmcgcGjhuqduIG3hu4FtIFIgxJHhu4MgdGhhbyB0w6FjDQoNCiMjIE3DtCB04bqjIGPGoSBi4bqjbiBkYXRhc2V0cw0KLSBMw6AgbeG7mXQgZGF0YSBmcmFtZQ0KLSBDw7MgNSBj4buZdCB0xrDGoW5nIOG7qW5nIHbhu5tpIDUgZ2nDoSB0cuG7iw0KLSBDw7MgMjM5IGjDoG5nIHTGsMahbmcg4bupbmcgduG7m2kgMjM5IHF1YW4gc8OhdA0KLSBEYXRhc2V0IGtow7RuZyBjw7MgZOG7ryBsaeG7h3UgdHLhu5FuZyANCi0gS8O9IGhp4buHdSBjw6FjIGPhu5l0IGzDoDoNCiAgLSBDb3VudHJ5IG5hbWU6IFTDqm4gcXXhu5FjIGdpYQ0KICAtIENvdW50cnkgQ29kZTogTcOjIHF14buRYyBnaWENCiAgLSAxOTkwOiBz4buRIGzGsOG7o25nIHBo4bulIG7hu68g4bufIGPDoWMgbsaw4bubYyB0csOqbiB0aOG6vyBnaeG7m2kgbsSDbSAxOTkwDQogIC0gMjAwMDogc+G7kSBsxrDhu6NuZyBwaOG7pSBu4buvIOG7nyBjw6FjIG7GsOG7m2MgdHLDqm4gdGjhur8gZ2nhu5tpIG7Eg20gMjAwMA0KICAtIDIwMTU6IHPhu5EgbMaw4bujbmcgcGjhu6UgbuG7ryDhu58gY8OhYyBuxrDhu5tjIHRyw6puIHRo4bq/IGdp4bubaSBuxINtIDIwMTUNCiAgDQpUaOG7sWMgaGnhu4duIHRoYW8gdMOhYyDEkeG7jWMgdsOgIGfDoW4gZOG7ryBsaeG7h3UgdsOgbyBtw6F5LiBTYXUgdGhhbyB0w6FjIG7DoHkgdGjDrCBk4buvIGxp4buHdSB04burIGZpbGUgIlJ1cmFsIHBvcHVsYXRpb24gZmVtYWxlLnhsc3giIMSRw6MgxJHGsOG7o2MgZ8OhbiB2w6BvIG0gbmjGsCBiw6puIGTGsOG7m2kNCmBgYHtyfQ0KI8SQ4buNYyBk4buvIGxp4buHdSB04burIGZpbGUgY3N2IHbDoCBnw6FuIHbDoG8gb2JqZWN0IG0NCmxpYnJhcnkoeGxzeCkNCm0gPC0gcmVhZC54bHN4KCJEOi9LVExSL1J1cmFsIHBvcHVsYXRpb24gZmVtYWxlICggb2YgdG90YWwpLnhsc3giLCBzaGVldEluZGV4ID0gMSwgaGVhZGVyID0gMSkNCmBgYA0KDQpLaeG7g20gdHJhIHhlbSAibSIgY8OzIHBo4bqjaSBsw6AgZGF0YSBmcmFtZSBoYXkga2jDtG5nLCBu4bq/dSDEkcO6bmcgdGjDrCB0cnVlIHbDoCBuZ8aw4bujYyBs4bqhaS4gVsOgIGvhur90IHF14bqjIHRy4bqjIHbhu4EgbMOgIFRSVUUgPiBtIGzDoCBt4buZdCBkYXRhZnJhbWUNCmBgYHtyfQ0KaXMuZGF0YS5mcmFtZShtKQ0KYGBgDQoNCljDoWMgxJHhu4tuaCBz4buRIGjDoG5nLCBz4buRIGPhu5l0IGPhu6dhIG0gZMaw4bubaSBk4bqhbmcgdmVjdG8uIEvhur90IHF14bqjIHRy4bqjIHbhu4EgdGjDrCBtIHTGsMahbmcg4bupbmcgY8OzIDIzOSBow6BuZyB2w6AgNSBj4buZdA0KYGBge3J9DQpkaW0obSkNCmBgYA0KDQpYw6FjIMSR4buLbmggc+G7kSDDtCB0cuG7kW5nIGPhu6dhIG0uIEvhur90IHF14bqjIHRy4bqjIHbhu4EgdMawxqFuZyDhu6luZyB24bubaSBtIGtow7RuZyBjw7Mgw7QgdHLhu5FuZyBuw6BvDQpgYGB7cn0NCnN1bShpcy5uYShtKSkNCmBgYA0KDQojIyBUaOG7kW5nIGvDqiBk4buvIGxp4buHdQ0KVGjhu7FjIGhp4buHbiB0aOG7kW5nIGvDqiBtw7QgdOG6oyBkYXRhc2V0IG7DoHkgdGEgxJHGsOG7o2Mga+G6v3QgcXXhuqMgYsOqbiBkxrDhu5tpLCDDvSBuZ2jEqWEgY8OhYyBj4buZdCBuaMawIHNhdToNCg0KIC0gbl9taXNzaW5nOiBz4buRIMO0IGThu68gbGnhu4d1IGLhu4sgbWlzcyh0cuG7kW5nKQ0KDQogLSBjb21wbGV0ZV9yYXRlOiB04bu3IGzhu4cgw7QgY8OzIGThu68gbGnhu4d1DQoNCiAtIG1lYW46IHRydW5nIGLDrG5oDQoNCiAtIHNkOiDEkeG7mSBs4buHY2ggY2h14bqpbg0KDQogLSBwMDogZ2nDoSB0cuG7iyBuaOG7jyBuaOG6pXQNCg0KIC0gcDI1OiBQaMOibiB24buLIHRo4bupIG5o4bqldA0KDQogLSBwNTA6IFBow6JuIHbhu4sgdGjhu6kgaGFpIGPFqW5nIGNow61uaCBsw6AgdHJ1bmcgduG7iw0KDQogLSBwNzU6IHBow6JuIHbhu4sgdGjhu6kgYmENCg0KIC0gcDEwMDogZ2nDoSB0cuG7iyBs4bubbiBuaOG6pXQNCg0KIC0gaGlzdDogYmnhu4N1IMSR4buTIEhpc3RvZ3JhbQ0KDQpYw6FjIMSR4buLbmggY8OhYyB0aMO0bmcgdGluIGPGoSBi4bqjbiB0cm9uZyBtDQpgYGB7cn0NCmxpYnJhcnkoc2tpbXIpDQpza2ltKG0pDQpgYGANCg0KIyMgxJDhu5VpIHTDqm4gY8OhYyBj4buZdCDEkeG7gyB0aGFvIHTDoWMNCkPDoWMga8O9IGhp4buHdSB0w6puIHTGsMahbmcg4bupbmcgdGhlbyB0aOG7qSB04buxIGzhuqduIGzGsOG7o3QgdOG7qyBj4buZdCAxIMSR4bq/biBj4buZdCAyNA0KDQogIC0gQ291bnRyeSBuYW1lPSAnY24nDQogIC0gQ291bnRyeSBDb2RlPSAnY2MnDQogIC0gMTk5MD0gJ2ExJw0KICAtIDIwMDA9ICdhMicNCiAgLSAyMDE1PSAnYTMnDQogIA0KYGBge3J9DQpuYW1lcyhtKSA9IGMoJ2NuJywnY2MnLCdhMScsJ2EyJywnYTMnKQ0KbmFtZXMobSkNCmBgYA0KICANCiMjIFLDunQgdHLDrWNoIGThu68gbGnhu4d1DQpWaeG7h2MgcsO6dCB0csOtY2ggZOG7ryBsaeG7h3UgdGhlbyDDvSBtdeG7kW4gY8WpbmcgbmjGsCBwaOG6p24gZOG7ryBsaeG7h3UgxJHGsOG7o2MgcsO6dCBz4bq9IGdpw7pwIHZp4buHYyB0w6xtIGhp4buDdSB0cuG7nyBuw6puIHThu5FpIMawdSBoxqFuLCDEkeG7gyBjaOG6r2MgY2jhuq9uIMSRw6MgcsO6dCB0csOtY2ggdGjDoG5oIGPDtG5nIHRhIGTDuW5nIGzhu4duaCBzdHIoeCkgduG7m2kgeCBsw6AgdMOqbiBvYmplY3QgbcOgIHRhIGfDoW4gZOG7ryBsaeG7h3UgxJHhu4MgY8OzIHRo4buDIHhlbSBjw6FjIMSR4buRaSB0xrDhu6NuZyB2w6Agc+G7kSBsxrDhu6NuZyBj4bunYSBiaeG6v24gY+G7p2EgeA0KDQpDaOG7jW4gcmEgNCBj4buZdCB0xrDGoW5nIOG7qW5nIGzDoCAiY24iLCJhMSIsImEyIiwiYTMiIHbDoCBjaOG7jW4gbmjhu69uZyBow6BuZyBi4bqvdCDEkeG6p3UgYuG6sW5nIGNo4buvICJBIiBnw6FuIHbDoG8gb2JqZWN0IG0xLiBL4bq/dCBxdeG6oyB0cuG6oyB24buBIGzDoCBtMSBn4buTbSBjw7MgNCBj4buZdCB2w6AgMTQgZ2nDoSB0cuG7iw0KYGBge3J9DQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShzdHJpbmdyKQ0KbTEgPC0gc2VsZWN0KG0sY24sYTEsYTIsYTMpICU+JSBmaWx0ZXIoc3RyX2RldGVjdChjbiwgIl5BIikpDQpzdHIobTEpDQpgYGANCiMjIE3DoyBob8OhIGThu68gbGnhu4d1DQoNCkPDonUgbOG7h25oIGJp4buDdSB0aOG7iyBt4buZdCDEkWnhu4F1IGtp4buHbiBzbyBzw6FuaCB0csOqbiBj4buZdCBhMyBj4bunYSBi4bqjbmcgZOG7ryBsaeG7h3UgbTEuIEPhu6UgdGjhu4M6DQogLSBO4bq/dSBnacOhIHRy4buLIHRyb25nIGPhu5l0IGEzIGPhu6dhIGjDoG5nIG7DoG8gxJHDsyBi4bqxbmcgMCAobTEkYTMgPT0gMCDEkcO6bmcpLCB0aMOsIGdpw6EgdHLhu4sgY+G7p2EgY+G7mXQgYTMgdHJvbmcgaMOgbmcgxJHDsyBz4bq9IMSRxrDhu6NjIHRoYXkgdGjhur8gYuG6sW5nIGNodeG7l2kgJ0tob25nIENvJy4NCiAtIE7hur91IGdpw6EgdHLhu4sgdHJvbmcgY+G7mXQgYTMgY+G7p2EgaMOgbmcgbsOgbyDEkcOzIGtow7RuZyBi4bqxbmcgMCAobTEkYTMgPT0gMCBzYWkpLCB0aMOsIGdpw6EgdHLhu4sgY+G7p2EgY+G7mXQgYTMgdHJvbmcgaMOgbmcgxJHDsyBz4bq9IMSRxrDhu6NjIHRoYXkgdGjhur8gYuG6sW5nIGNodeG7l2kgJ0NvJw0KIGBgYHtyfQ0KbTEkYTMucGhhbmxvYWkgPC0gaWZlbHNlKG0xJGEzID09IDAsICdLaG9uZyBDbycsICdDbycpDQpzdHIobTEpDQpgYGANCiMjIEzhuq1wIGLhuqNuZyB04bqnbiBz4buRDQoNCiANCg==