Nhiệm vụ 3.1:
population-and-demography
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
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
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
Country.name |
0 |
1 |
4 |
59 |
0 |
254 |
0 |
Variable type: numeric
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 |
▇▁▁▁▁ |
Đổ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"
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 ...
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 ...
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"
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ề:
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 ...
Nhiệm vụ 3.2:Rural
population female.xlsx
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
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
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
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
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 |
▃▆▆▇▃ |
Đổ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"
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" ...
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" ...
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==