Đánh chỉ số logic
Thuộc phần Kiến thức nền tảng trong hành trình R của Coddy. Bài học 68 trên 78.
Thay vì chỉ định vị trí chính xác, bạn có thể dùng một vectơ logic để chọn các phần tử. Kỹ thuật này, gọi là lập chỉ mục logic (logical indexing), cho phép bạn lọc một vectơ dựa trên các điều kiện thay vì vị trí.
Khi áp dụng phép so sánh cho một vector, R trả về một vector logic có cùng độ dài:
numbers <- c(10, 20, 30, 40, 50)
print(numbers > 25)Đầu ra:
[1] FALSE FALSE TRUE TRUE TRUEBạn có thể dùng trực tiếp véc-tơ logic này bên trong dấu ngoặc vuông để trích xuất các phần tử khớp:
numbers <- c(10, 20, 30, 40, 50)
print(numbers[numbers > 25])Đầu ra:
[1] 30 40 50R chỉ giữ lại các phần tử mà véc-tơ logic có giá trị TRUE. Cách này gọn gàng hơn nhiều so với việc viết vòng lặp để lọc dữ liệu. Bạn có thể kết hợp các điều kiện bằng cách dùng toán tử logic:
numbers <- c(10, 20, 30, 40, 50)
print(numbers[numbers >= 20 & numbers <= 40])Đầu ra:
[1] 20 30 40Đánh chỉ mục logic là một trong những tính năng mạnh mẽ nhất của R để thao tác dữ liệu, cho phép bạn lọc các tập dữ liệu bằng những biểu thức đơn giản, dễ đọc.
Thử thách
DễBạn sẽ nhận được hai dòng đầu vào:
- Một danh sách số được phân tách bằng dấu phẩy (ví dụ:
15,42,8,67,23,91,34,12,56) - Hai giá trị ngưỡng được phân tách bằng dấu phẩy, biểu thị một khoảng (ví dụ:
20,60)
Dùng cách lập chỉ mục logic:
- Tạo một vector số từ các số được phân tách bằng dấu phẩy
- Trích xuất và in ra tất cả phần tử nhỏ hơn ngưỡng thứ nhất (cận dưới)
- Trích xuất và in ra tất cả phần tử lớn hơn ngưỡng thứ hai (cận trên)
- Trích xuất và in ra tất cả phần tử nằm trong khoảng (lớn hơn hoặc bằng ngưỡng thứ nhất VÀ nhỏ hơn hoặc bằng ngưỡng thứ hai)
Ví dụ, nếu đầu vào là:
5,25,10,45,60,15,80,35,50
20,50Đầu ra sẽ là:
[1] 5 10 15
[1] 60 80
[1] 25 45 35 50Giải thích:
- Các phần tử nhỏ hơn 20: 5, 10, 15
- Các phần tử lớn hơn 50: 60, 80
- Các phần tử nằm trong khoảng từ 20 đến 50 (bao gồm cả hai cận): 25, 45, 35, 50
Dùng toán tử & để kết hợp các điều kiện lọc khoảng.
Tự làm thử
# Đọc dữ liệu đầu vào
con <- file("stdin", "r")
numbers_input <- suppressWarnings(readLines(con, n = 1))
thresholds_input <- suppressWarnings(readLines(con, n = 1))
close(con)
# Phân tích các số phân tách bằng dấu phẩy thành một vectơ số
numbers <- as.numeric(unlist(strsplit(numbers_input, ",")))
# Phân tích các giá trị ngưỡng
thresholds <- as.numeric(unlist(strsplit(thresholds_input, ",")))
lower_bound <- thresholds[1]
upper_bound <- thresholds[2]
# TODO: Viết code bên dưới
# 1. Dùng chỉ số logic để lấy các phần tử nhỏ hơn lower_bound rồi in ra
# 2. Dùng chỉ số logic để lấy các phần tử lớn hơn upper_bound rồi in ra
# 3. Dùng chỉ số logic với toán tử & để lấy các phần tử trong khoảng, bao gồm cả hai đầu mút, rồi in raBài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Tất cả bài học trong Kiến thức nền tảng
4Toán tử phần 2
Toán tử logic (AND, OR)Toán tử logic phần 2 (NOT)Ôn tập: logic đơn giảnLogic vector hóa phần 1Logic vector hóa phần 27Máy tính chia hóa đơn
Thông báo chào mừngNhận đầu vào từ người dùng13Vectơ nâng cao
Cắt lát và đánh chỉ số vectơĐánh chỉ số logicPhép toán số học và tái chế vectơToán tử %in%2Biến và kiểu dữ liệu
Kiểu dữ liệu sốKiểu dữ liệu số nguyênKiểu dữ liệu ký tựKiểu dữ liệu logicKiểm tra kiểu dữ liệuQuy tắc đặt tênGiá trị thiếu: NATóm tắt: tạo biến8Vòng lặp
Vòng lặp forVòng lặp whileBreakNext (continue)Ôn tập: giai thừaTạo dãy (seq, :)Vòng lặp lồng nhauÔn tập: đầu vào động3Toán tử phần 1
Toán tử số họcPhép chia lấy phần nguyên và phép moduloToán tử gánÔn tập: phép tính đơn giảnToán tử so sánh6Nhập xuất cơ bản
In đầu raDùng cat để in đầu raĐầu ra với biếnĐọc đầu vào bằng readline()Cơ bản về chuyển đổi kiểuÔn tập: máy tính tuổiÔn tập: đúng hay sai9Hàm
Khai báo hàmĐối số hàmGiá trị trả vềÔn tập: hàm SigmaÔn tập: hàm xác thựcGiá trị tham số mặc địnhTự luyện tập: Trình biên dịch R online