- 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.
Duc Nguyen
www.tuhocr.com
Câu 1: Khi x
được gán giá trị 5
thì class(x)
thuộc loại nào?
> x <- 5
> class(x) ?
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) ?
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) ?
> 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]] ?
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 ?
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
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
.
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
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
?
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
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à ...
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
?
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.
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
và 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.
Lọc dữ liệu theo kiểu logical cho Ozone
và Temp
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?
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?
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