Phần I - Lập trình R cơ bản

Hãy tạo ra các véc tơ sau trong R, sử dụng hàm rep và hàm seq

  1. (1, 2, 3, … 19, 20)

  2. (20, 19, … 2, 1)

  3. (1, 2,3, … 19, 20, 19, 18, … 2, 1)

  4. Tạo ra một véc tơ có tên tmp có dạng (4,6,3). Hãy thực hiện:

  5. Tạo ra véc tơ e có dạng (4,6,3,4,6,3,…,4,6,3) sao cho bộ số (4,6,3) xuất hiện 10 lần

  6. Tạo ra véc tơ f có dạng (4,6,3,4,6,3,…,4,6,3,4) sao cho số 4 xuất hiện 11 lần, các số 6 và 3 xuất hiện 10 lần.

myvec1 <- c(1:20)
myvec1
##  [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20
myvec2 <- c(20:1)
myvec2
##  [1] 20 19 18 17 16 15 14 13 12 11 10  9  8  7  6  5  4  3  2  1
myvec3 <- c(1:19,20:1)
myvec3
##  [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 19 18 17 16 15
## [26] 14 13 12 11 10  9  8  7  6  5  4  3  2  1
tmp <- c(4,6,3)
rep(tmp, 10)
##  [1] 4 6 3 4 6 3 4 6 3 4 6 3 4 6 3 4 6 3 4 6 3 4 6 3 4 6 3 4 6 3
# Lặp lại theo từng số với số lần lặp chỉ định
rep(tmp, c(11,10,10))
##  [1] 4 4 4 4 4 4 4 4 4 4 4 6 6 6 6 6 6 6 6 6 6 3 3 3 3 3 3 3 3 3 3
# Lặp lại bộ số (4,6,3) 10 lần và thêm length thành 31 với tham số l=31
rep(tmp, l = 31)
##  [1] 4 6 3 4 6 3 4 6 3 4 6 3 4 6 3 4 6 3 4 6 3 4 6 3 4 6 3 4 6 3 4

Bài tập tiếng Anh

Khởi tạo véc tơ xVec và yVec theo yêu cầu:

set.seed(50)
xVec <- sample(0:999, 250, replace=T)
yVec <- sample(0:999, 250, replace=T)

Ý a:

Tạo ra véc tơ có dạng \((y_2 - x_1,..., y_n - x_{n-1}).\)

yVec[-1] - xVec[-length(xVec)]
##   [1] -359  692 -724   40 -626 -719 -809  527  -89 -829  248  144 -749 -352 -220
##  [16] -249  387 -492   85 -106  303  -97 -436  146  282 -206 -385  -96 -567 -757
##  [31]  287  277 -562  292  -89  -93 -847 -822 -203  679  309 -199 -273    4  -47
##  [46]  142  122  414 -602 -304 -674   -8 -662 -168 -349  -63 -221  115    1 -600
##  [61] -382 -487    2  375   19 -113 -634  107   60   47  214 -325  -49 -290  169
##  [76]  290 -624  457 -408  581 -189  204  -80  409  209 -410  461   37 -127  185
##  [91]  382 -446   44  -56 -270 -598 -378 -155  134 -187  109  316 -139  158  305
## [106]  -39 -119  182  441 -403 -107  615  614 -378 -464   31 -385  665  674 -217
## [121] -279 -406  -45 -489 -350 -451  -18  660  504   -6   60 -130 -379 -302 -219
## [136]  -21  438  129 -201 -275  131  694  -96 -176  117 -113  887 -439 -126 -148
## [151]  392 -158  444 -291  232  -12 -274  477 -510  336 -759 -363 -195 -220  160
## [166] -308 -333  302 -183  227  -12  428  665 -301   -8  222  -50 -444 -425 -650
## [181] -424  318  154  238 -727   71  472  908  265  654 -644 -754  657 -382 -313
## [196]  910 -381  394 -596  602  397 -572  378 -274 -271  601 -791 -378 -461   39
## [211]  163 -118 -332 -170  -94  262 -474  566 -273 -366 -400  374   42  100  135
## [226]  609 -527  580 -219  128 -524  620 -206  410 -280  -66  -50  252  279   48
## [241] -595  -59 -623  247  514   62 -102  475  287

Ý b:

Tạo véc tơ tính có dạng:

sin(yVec[-length(yVec)]) / cos(xVec[-1])
##   [1]  -0.251172387  -1.714506221  -1.020534796   1.903299501   4.119691628
##   [6]   0.474814101   0.989633106   1.157740470  -2.882161424   1.394557843
##  [11]   3.580223541  -0.664006287   0.847013135  -1.095954285   0.469790086
##  [16]  -0.544605141  -1.253304942  -0.353697082  -1.357919064  -1.271051804
##  [21]   0.009344711 -10.576799813  -0.674196809  -2.087577737 -32.238631575
##  [26]  -4.966988605  -0.490160550  -0.043753175  -1.766774293  -2.456887042
##  [31]  -1.034891510  -0.118782199   0.036938122  -0.173612680   0.851649079
##  [36]  -0.353501116  -1.024989992   0.589100687   4.018304788  -1.004929483
##  [41]   0.977012057   0.952499185  -0.553614203   1.115864382   1.254898524
##  [46]   1.155274507  -1.032061497   0.906767318  -0.945760017   2.658291106
##  [51]  -1.254932608  -0.547511538   3.928248333  -3.673653649  -0.127796877
##  [56]  -3.226308105  -0.894400173   0.701414603   2.128023689  -0.414254810
##  [61]  -0.917829147   0.558286542   0.000000000  -0.564183939   0.946409854
##  [66]   1.407199013   0.800206658  -1.146531865   1.181638746   0.495187680
##  [71]   1.446378081  -1.004546310  -0.648760582  -0.909533924   2.364794213
##  [76]  -1.067542299   0.735761986  -1.085930368   1.046185000  -0.235199131
##  [81]   5.984225913   0.811049413   1.134803403   0.652427664  -0.915236455
##  [86]   2.180704313   1.832739489  -0.433287348  -2.250658142  -1.675524524
##  [91]  -1.553949156  -1.249207462  12.092176300   0.808459235   0.832313214
##  [96]   0.903245844   1.066231524   5.294081295  25.183138328  -1.825927150
## [101]   0.246533436   0.874187672   1.092740398  -0.722495528   0.766922081
## [106]   1.339270617  -1.106082115   2.130306844   0.799377104   6.004793950
## [111]   8.758581778  -0.981032578   1.256557471  -2.048399633   1.195677807
## [116]  -1.040371386   0.644501924  -3.483330739 -13.236374600   1.549790230
## [121]  31.620598675   1.501371199  -0.815852894  -0.286937344   2.086096713
## [126]   0.169201819  -0.944412409   1.404263380   1.918061130  -6.647769454
## [131]   1.097542414  22.775427858   1.581242582   0.596376118   1.286025755
## [136]  -0.274884286   1.792271243   0.929571073  -1.398639309   0.180473893
## [141]  -0.861690054  -3.817208262   1.406954246  -0.116266112   0.911847938
## [146]   1.720472285  -0.351853469  -0.140708190 102.843164547  -0.814695119
## [151]  -4.198084329  -0.796216596  -1.483961597  -0.913007027   2.209820017
## [156]  -0.874704929  -7.182835580  -0.171459039   1.010581535  -0.060316505
## [161]  -5.934493823  -0.194382721   2.788122775   7.857328199   9.813569870
## [166]  -1.041969001 -17.395410126   0.604907292  -1.027075437  -0.256821966
## [171]   0.380364801  -0.898464055  -0.755130341  -4.425456175   0.969617473
## [176]   0.292765308  -1.130607542   0.904382713  -0.969592200  -0.069832291
## [181]   0.000000000  -0.629251004   3.078476507   0.433631660   1.711984983
## [186]  -3.189462891   0.221313374  -1.594268883  -0.158597479   0.218596389
## [191]   0.984958329  -2.227888183   0.233630793  -2.913722008   0.773617325
## [196]   1.026041041   9.839208858  -1.672630213  -0.370798565   1.312355946
## [201]  -0.889637266  -1.473979138  -0.618321180  -0.117513292   0.237786925
## [206]   0.876611998   1.328547955  -0.982203606  -0.061533125   1.004160645
## [211]  -1.266243000   0.534185156   0.571802673  -0.622297532   0.580410706
## [216]  -1.482925131   1.095346759   1.701972216  -0.976847974  -1.309841610
## [221]   1.053044730   0.277103276   0.934757395  -1.112172484  -0.326263919
## [226]   0.416934946  -1.171403611  -1.014835503  -0.549469340  -0.741222996
## [231]   1.877938004  -0.074048223  -0.021532438 -11.511078788  -1.389914300
## [236]   2.423540052   0.791040396  -6.445834186  -0.523259399  -1.446820579
## [241]  -0.734282899  -1.420238075  -0.820938658  -0.949002149   1.452579737
## [246]  -2.219943144  -1.114115747   0.747424267  -0.919986986

Ý c:

Tạo véc tơ tính có dạng

xVec[-c(249,250)] + 2*xVec[-c(1,250)]-xVec[-c(1,2)]
##   [1] -432 1554  145  937 1811 2133  855  883 2241 1428 -681 1225 2238  842  885
##  [16]  391 1031 1982 1288  798  416 1618 1932 1055 2127 1157 1459  956 2323 1263
##  [31] -426 1014  880 -276  863 1761 2374 1379  344  434 1629 1203 2177  682   58
##  [46] 1226  815 1005 1830 2686  320 1871  700 1189 1356 2095  818 -840 1403 1790
##  [61] 1343  564  803  303 1559 2033 1126  711 1608  614  976 2108 1821  473 -281
##  [76] 1586  473 1755  263 1559   -3 1558 1209  -98  846 1131  848  778  350 -508
##  [91] 1253   37 1380 1064  799 1816 2216  816 1445 1179  931 1474  394 1219  556
## [106] 1333 1798  406 1122 1175  636  135  676 1807 1514 1387  531  154  478  408
## [121] 2011 1071 1427 1472 2076 1747  369 -343 1252  997  400  790 1398 2042  776
## [136]  689 1589  547 1510  934 -289  978 1202 -593 1834  228 1515 1275  452  979
## [151] 1210  804 1813  794  435 1688  948  914 1012 1244 1965 1456 1683  798 1463
## [166] 2673  608 1735  204 1100  713  462  352 1109 2028  401 1380 1531 1223 1660
## [181] 1373  632 -148 1321 2084 1650  112  559  147  552 2410  782  703 2550  354
## [196] 1500  368 1147  673 -268 1355 1719  506 2061  279  813 1833 1976 2057 2043
## [211] 1030 1081  963  808 -241 1331  488  470 1993 1412  454 1210 2389  835 -187
## [226] 1162 -177 2083  286 1363  478  423  308 1123   43 1458  964 1250  750 1493
## [241] 2121 2040  760  761  445 1787 1083 -306

Ý d:

Tính tổng tích lũy sau:

sum(exp(-xVec[-1])/(xVec[-length(xVec)]+10))
## [1] 5.029496e-05

Sử dụng cumprod

Sử dụng hàm cumprod để tính biểu thức sau: \[\frac{2}{3}+(\frac{2}{3} \frac{4}{5})+(\frac{2}{3} \frac{4}{5} \frac{6}{7})+...+(\frac{2}{3} \frac{4}{5} \frac{38}{39})\]

1+sum(cumprod(seq(2,38,b=2)/seq(3,39,b=2)))
## [1] 6.976346

Phần II - Lập trình hàm trong R

Sử dụng lập trình hàm trong R để làm các bài toán sau:

Nhập vào một véc tơ myvector gồm có n số hạng nguyên. Hãy viết:

  • Hàm tính tổng, giá trị trung bình các phần tử của myvector

  • Hàm tính giá trị nhỏ nhất, lớn nhất của myvector

  • Hàm tính giá trị phương sai và độ lệch chuẩn của myvector

Hàm tổng, trung bình

#Viết hàm tính tổng
tong <-  function(x){
  sum = 0
  for(i in 1:length(x)){
    sum = sum + x[i]
  }
  return (sum)
}
#Viết hàm tính trung bình, gọi lại hàm tong(x)
trung_binh <-  function(x){
  trungbinh <- tong(x)/length(x)
  return(trungbinh)
}

Hàm min, max

#Viết hàm tìm giá trị lớn nhất 
lonnhat <- function(x){
  ln <- x[1]
  for (i in 1: length(x)){
    if(ln < x[i]){
      ln = x[i]
    }
  }
  return(ln)
}
#Viết hàm tìm giá trị nhỏ nhất
nhonhat <- function(x){
  nn <- x[1]
  for(i in 1:length(x)){
    if(nn > x[i]){
      nn = x[i]
    }
  }
  return(nn)
}

Hàm phương sai, độ lệch chuẩn

#Viết hàm tính giá trị phương sai, độ lệch chuẩn

phuongsai <-  function(x) {
  a = (x - trung_binh(x))^2
  sum = 0
  for (i in 1:length(x)) {
      sum = sum + a[i]
  }
  return(sum/(length(x)-1))
}

lechchuan <- function(x){
    
  return (sqrt(phuongsai(x)))
  
}

Hiệp phương sai

Trong lý thuyết xác suất và thống kê, hiệp phương sai là độ đo sự biến thiên cùng nhau của hai biến ngẫu nhiên (phân biệt với phương sai - đo mức độ biến thiên của một biến). Nếu 2 biến có xu hướng thay đổi cùng nhau thì hiệp phương sai giữa hai biến này có giá trị dương. Mặt khác, nếu một biến nằm trên giá trị kì vọng còn biến kia có xu hướng nằm dưới giá trị kì vọng, thì hiệp phương sai của hai biến này có giá trị âm.

# Viết hàm tính hiệp phương sai covariance
covariance <- function(x, y){
  a = (x - mean(x))*(y-mean(y))
  sum = 0
  if(length(x) == length(y)){
    for (i in 1:length(x)){
      sum = sum + a[i]
    }
  }
  return(sum/(length(x)-1))
}
# Gọi hàm
x1 <- c(1:9)
y1 <- c(2:10)
covariance(x1, y1)
## [1] 7.5
#Kiểm tra tính trùng khớp với hàm cov(x,y)
cov(x1, y1)
## [1] 7.5

Phần III - Trực quan dữ liệu

Trực quan tương quan

Trực quan dữ liệu tương quan cho 2 biến số bình quân thu nhập đầu người và tuổi thọ trung bình cho các quốc gia

library(gapminder)
library(ggplot2)
mydata <- gapminder
library(ggthemes)
ggplot(data = mydata, mapping = aes(x = gdpPercap, y = lifeExp)) + geom_point(aes(color = continent)) +
  geom_smooth(method = "loess") +
  scale_x_log10() +
  labs(x =" Log GDP per Capita", y = "Life Expectancy") +
  ggtitle("Association between GDP Per Capita and Life Expectancy") + theme(plot.title = element_text(lineheight = 0.8, face = "bold", hjust = 0.5)) + theme_economist()

Vẽ biểu đồ histogram

year2007 <- subset(mydata, year == 2007)
head(year2007)
## # A tibble: 6 × 6
##   country     continent  year lifeExp      pop gdpPercap
##   <fct>       <fct>     <int>   <dbl>    <int>     <dbl>
## 1 Afghanistan Asia       2007    43.8 31889923      975.
## 2 Albania     Europe     2007    76.4  3600523     5937.
## 3 Algeria     Africa     2007    72.3 33333216     6223.
## 4 Angola      Africa     2007    42.7 12420476     4797.
## 5 Argentina   Americas   2007    75.3 40301927    12779.
## 6 Australia   Oceania    2007    81.2 20434176    34435.
ggplot(data = year2007, mapping = aes(gdpPercap)) +
  geom_histogram(fill = "#e36b3a", color = "#8741a6") +
  labs(title = "Distribution of GDP per Capita in 2007")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Biểu đồ mật độ xác suất

ggplot(data = year2007, mapping = aes(gdpPercap, fill = continent)) +
  geom_density(alpha = 0.4)

Biểu đồ thanh bar

year2007$level_age[year2007$lifeExp < 60.0] <- "< 60 age"
## Warning: Unknown or uninitialised column: `level_age`.
year2007$level_age[60.0 <= year2007$lifeExp & year2007$lifeExp <= 80.0] <- "60-80 age"
year2007$level_age[year2007$lifeExp > 80.0] <- "> 80 age"
ggplot(data = year2007, aes(x = continent, fill = level_age)) +
  geom_bar()

asia <- subset(mydata, year == 2007 & continent == "Asia")
dim(asia)
## [1] 33  6
ggplot(data = asia, mapping = aes(x = country, y = lifeExp, fill = country)) + geom_bar(stat = "identity", width = 0.9) + coord_flip()

library(gridExtra
        )
ggplot(data = asia, mapping = aes(x = reorder(country, lifeExp), y = lifeExp, fill = country)) + 
  geom_bar(stat = "identity", width = 0.9) + 
  coord_flip() + 
  theme(legend.position = "none") + 
  labs(x="", y="Life Expectancy") -> graph1

ggplot(data = asia, mapping = aes(x = reorder(country, gdpPercap), y = gdpPercap, fill = country)) + 
  geom_bar(stat = "identity", width = 0.9) + 
  coord_flip() + 
  theme(legend.position = "none") + 
  labs(x="", y="GDP Per Capita") -> graph2
# Tổng hợp 2 biểu đồ để so sánh
grid.arrange(graph1, graph2, ncol = 2)

Biểu đồ hộp box-plot

ggplot(data = year2007, aes(x = continent, y = gdpPercap, fill = continent)) + geom_boxplot(alpha = 0.6) + geom_jitter(alpha = 0.3)