Bài tập 1

Các lệnh căn bản trong R

Duc Nguyen
www.tuhocr.com

Nội dung

  • Các lệnh cơ bản về vector, matrix, list, data frame.
  • Các lệnh subset, trích xuất dữ liệu.

Câu 1: Khi x được gán giá trị 5 thì class(x) thuộc loại nào?

> x <- 5
> class(x) ?
  1. integer
  2. vector
  3. numeric
  4. character

Thông thường con số (number) khi gán vào vector sẽ ở loại numeric.

Câu 2: Khi x có các thành phần bên trong gồm chữ, số, giá trị logic thì class(x) thuộc loại nào?

> x <- c(2, "a", TRUE)
> print(x)
[1] "2"    "a"    "TRUE"
> class(x) ?
  1. integer
  2. vector
  3. numeric
  4. character

Chú ý các thành phần trong x khi được print ra sẽ ở trong dấu nháy kép, cho thấy nó thuộc class character.

Khi có sự khác biệt giữa các thành phần trong vector thì class character là lớp sau cùng được chọn.

Câu 3: Kết quả lệnh rbind(x, y) sẽ là ...

> x <- c(1, 4, 7) 
> y <- c(3, 2, 11)
> rbind(x, y) ?
  1. vector
  2. matrix 3 hàng 2 cột
  3. matrix 2 hàng 3 cột
  4. data frame 2 hàng 3 cột
> rbind(x, y)
  [,1] [,2] [,3]
x    1    4    7
y    3    2   11
> rbind(x, y) -> m
> class(m)
[1] "matrix" "array"

Lệnh rbind() dùng để ghép các vector thành hàng (row) theo kiểu row-wise. Thông thường kết quả ghép nối (hàng hay cột) giữa các vector sẽ hình thành matrix.

Câu 4: Kết quả lệnh x[[1]] sẽ là ...

> x <- list(12, "a", "b", TRUE) 
> x[[1]] ?
  1. list con có chứa một thành phần có giá trị 12
  2. character vector có chứa một thành phần có giá trị 12
  3. numeric vector có chứa một thành phần có giá trị 12
  4. câu 2 và 3 đều đúng

Khi subset list bằng [[ thu được element ở vị trí tương ứng. Chi tiết

> x <- list(12, "a", "b", TRUE) 
> x[[1]]
[1] 12
> x[[1]] -> ddd
> class(ddd)
[1] "numeric"
> is.vector(ddd)
[1] TRUE
# Lưu ý:
> x[1] # Nếu dùng `[` để subset từ list mẹ 
[[1]]  # sẽ thu được list con
[1] 12
> x[1] -> jjj
> is.vector(jjj) # Vì list là một loại vector
[1] TRUE
> is.list(jjj)
[1] TRUE
> is.list(ddd) # Nhưng vector chưa chắc là list
[1] FALSE

Câu 5: Kết quả lệnh x + y sẽ là...

> x <- 1:4
> y <- 2
> x + y ?
  1. numeric vector có giá trị 3, 2, 3, 4
  2. numeric vector có giá trị 3, 4, 5, 6
  3. integer vector có giá trị 3, 4, 5, 6
  4. không có câu nào đúng

Khi cộng hai vector không cùng length thì vector có length ngắn hơn sẽ cộng lần lượt vào các thành phần của vector có length dài hơn. Khái niệm recycle

> x
[1] 1 2 3 4
> y
[1] 2
> x + y
[1] 3 4 5 6
> class(x + y)
[1] "numeric"

Câu 6: Có vector x <- c(7, 14, 4, 5, 13, 12, 10). Ta dùng lệnh nào để thay thế các số lớn hơn 10 trong vector x chuyển thành số 6?

• Cách 1: x[x > 10] == 6
• Cách 2: x[x > 6] <- 10
• Cách 3: x[x >= 10] <- 6
• Cách 4: x[x > 10] <- 6
  1. Cách 1
  2. Cách 2
  3. Cách 3
  4. Cách 4

Cần kiểm tra ý nghĩa từng nhóm lệnh trong cú pháp. Ví dụ x[x > 10] sẽ ra kết quả nào, sau đó gán giá trị 6 vào.

> x <- c(7, 14, 4, 5, 13, 12, 10)
> x
[1]  7 14  4  5 13 12 10
> x[x > 10] # Subset các số lớn hơn 10 trong `x`
[1] 14 13 12
> x[x > 10] <- 6 # Gán giá trị 6 vào các số này
> x
[1]  7  6  4  5  6  6 10

Câu 7: Download dataset từ đây về, sau đó giải nén. Đặt file hw1_data.csv vào thư mục làm việc R. Import file này vào RStudio bằng lệnh read.csv(), đặt tên là hw1. Liệt kê tên của các cột trong hw1.

  1. Month, Day, Temp, Wind
  2. Ozone, Solar.R, Wind, Temp, Month, Day
  3. 1, 2, 3, 4, 5, 6
  4. Ozone, Solar.R, Wind

Sử dụng lệnh names().

read.csv("homework/hw1_data.csv") -> hw1
> class(hw1)
[1] "data.frame"
> names(hw1)
[1] "Ozone"   "Solar.R" "Wind"    "Temp"    "Month"   "Day" 

Câu 8: Subset 2 hàng đầu tiên của file hw1_data.csv và in ra kết quả ở console.

# Kết quả 1:
  Ozone Solar.R Wind Temp Month Day
1    41     190  7.4   67     5   1
2    36     118  8.0   72     5   2

# Kết quả 2:
  Ozone Solar.R Wind Temp Month Day
1     7      NA  6.9   74     5  11
2    35     274 10.3   82     7  17
  1. Kết quả 1
  2. Kết quả 2

Sử dụng lệnh hw1[1:2, ] | hw1[c(1:2), ] | hw1[c(1, 2), ] | head(hw1, n = 2).

> hw1[1:2, ]
  Ozone Solar.R Wind Temp Month Day
1    41     190  7.4   67     5   1
2    36     118  8.0   72     5   2

Câu 9: Có bao nhiêu dòng (row) trong data frame hw1?

  1. 45
  2. 153
  3. 129
  4. 160

Sử dụng lệnh dim(hw1) | nrow(hw1).

> nrow(hw1)
[1] 153

Câu 10: In 2 dòng cuối của data frame hw1 ra console?

# Kết quả 1:
    Ozone Solar.R Wind Temp Month Day
152    31     244 10.9   78     8  19
153    29     127  9.7   82     6   7

# Kết quả 2:
    Ozone Solar.R Wind Temp Month Day
152    18     131  8.0   76     9  29
153    20     223 11.5   68     9  30
  1. Kết quả 1
  2. Kết quả 2

Sử dụng lệnh hw1[152:153, ] | tail(hw1, n = 2)

> tail(hw1, n = 2)
    Ozone Solar.R Wind Temp Month Day
152    18     131  8.0   76     9  29
153    20     223 11.5   68     9  30

Câu 11: Giá trị ở dòng thứ 40 của cột Ozone là ...

  1. 22
  2. NA
  3. 71
  4. 56

Sử dụng lệnh hw1$Ozone[40] | View(hw1) rồi tìm thủ công.

> hw1$Ozone[40]
[1] 71

Câu 12: Có bao nhiêu giá trị NA (missing value) trong cột Ozone?

  1. NA
  2. 37
  3. 34
  4. 40

Sử dụng lệnh is.na(hw1$Ozone) sau đó là table() | summary(hw1$Ozone) rồi tìm kết quả.

# Cách 1:
> is.na(hw1$Ozone) -> ok
> table(ok)
ok
FALSE  TRUE 
  116    37
# Cách 2:
> summary(hw1$Ozone)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
   1.00   18.00   31.50   42.13   63.25  168.00      37
> summary(hw1$Ozone)[7]
NA's 
  37

Câu 13: Sau khi loại bỏ các giá trị NA trong cột Ozone, tính giá trị trung bình.

  1. 42.13
  2. 41.13
  3. 52.19
  4. 52.20

Sử dụng lệnh complete.cases(hw1$Ozone) sau đó subset loại bỏ NA rồi tính mean() | summary(hw1$Ozone) rồi tìm kết quả.

> mean(hw1$Ozone) # Tính trực tiếp trên vector
[1] NA # có chứa giá trị NA lẫn con số sẽ ra NA.

# Vì vậy cần subset ra vector mới chỉ chứa số 
# (làm sạch dữ liệu)
> good <- complete.cases(hw1$Ozone)
> hw1$Ozone[good] -> well
> mean(well)
[1] 42.12931

Câu 14: Chiết xuất ra những hàng trong data frame hw1 mà có giá trị Ozone lớn hơn 31 giá trị Temp lớn hơn 90. Sau đó tính giá trị trung bình cho cột Solar.R của bảng số liệu con (subset) này.

  1. 212.8
  2. 334.0
  3. 205.0
  4. 117.6

Lọc dữ liệu theo kiểu logical cho OzoneTemp sau đó làm cơ sở để subset trong hw1.

> hw1$Ozone > 31 -> ok1
> hw1$Temp > 90 -> ok2
> length(ok1)
[1] 153
> length(ok2)
[1] 153
> ok1 & ok2 -> ok3 # Gộp hai điều kiện
> length(ok3)
[1] 153
> hw1[ok3, ] # Subset ra bảng dữ liệu mới
     Ozone Solar.R Wind Temp Month Day
NA      NA      NA   NA   NA    NA  NA
NA.1    NA      NA   NA   NA    NA  NA
69      97     267  6.3   92     7   8
70      97     272  5.7   92     7   9
NA.2    NA      NA   NA   NA    NA  NA
NA.3    NA      NA   NA   NA    NA  NA
120     76     203  9.7   97     8  28
121    118     225  2.3   94     8  29
122     84     237  6.3   96     8  30
123     85     188  6.3   94     8  31
124     96     167  6.9   91     9   1
125     78     197  5.1   92     9   2
126     73     183  2.8   93     9   3
127     91     189  4.6   93     9   4
> hw1[ok3, ] -> yes
> na.omit(yes) -> final # Loại bỏ giá trị NA
> final 
    Ozone Solar.R Wind Temp Month Day
69     97     267  6.3   92     7   8
70     97     272  5.7   92     7   9
120    76     203  9.7   97     8  28
121   118     225  2.3   94     8  29
122    84     237  6.3   96     8  30
123    85     188  6.3   94     8  31
124    96     167  6.9   91     9   1
125    78     197  5.1   92     9   2
126    73     183  2.8   93     9   3
127    91     189  4.6   93     9   4
> mean(final$Solar.R)
[1] 212.8

Câu 15: Nhiệt độ trung bình của tháng 6 là bao nhiêu?

  1. 75.2
  2. 84.3
  3. 69.4
  4. 79.1

Subset riêng tháng 6 bằng lệnh hw1[hw1$Month == 6, ] sau đó tính mean() của Temp.

> hw1[hw1$Month == 6, ] -> june
> mean(june$Temp) # Vì `Temp` trong june không có
[1] 79.1     # giá trị NA nên ta tính mean trực tiếp

Câu 16: Trong tháng 5, giá trị cực đại maximum của Ozone là bao nhiêu?

  1. 18
  2. 97
  3. 115
  4. 100

Subset riêng tháng 5 bằng lệnh hw1[hw1$Month == 5, ] sau đó lọc NA rồi tính max() của Ozone.

> hw1[hw1$Month == 5, ] -> may
> na.omit(may) -> sense
> sense
   Ozone Solar.R Wind Temp Month Day
1     41     190  7.4   67     5   1
2     36     118  8.0   72     5   2
3     12     149 12.6   74     5   3
4     18     313 11.5   62     5   4
7     23     299  8.6   65     5   7
8     19      99 13.8   59     5   8
9      8      19 20.1   61     5   9
12    16     256  9.7   69     5  12
13    11     290  9.2   66     5  13
14    14     274 10.9   68     5  14
15    18      65 13.2   58     5  15
16    14     334 11.5   64     5  16
17    34     307 12.0   66     5  17
18     6      78 18.4   57     5  18
19    30     322 11.5   68     5  19
20    11      44  9.7   62     5  20
21     1       8  9.7   59     5  21
22    11     320 16.6   73     5  22
23     4      25  9.7   61     5  23
24    32      92 12.0   61     5  24
28    23      13 12.0   67     5  28
29    45     252 14.9   81     5  29
30   115     223  5.7   79     5  30
31    37     279  7.4   76     5  31
> max(sense$Ozone)
[1] 115