Cắt lát và đánh chỉ số vectơ
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 67 trên 78.
Bạn đã học cách truy cập từng phần tử riêng lẻ và lặp qua các vectơ (vector). Giờ hãy cùng khám phá cách trích xuất nhiều phần tử cùng lúc bằng cách cắt lát (slicing). Kỹ thuật này cho phép bạn lấy một tập con của vectơ chỉ trong một thao tác.
Để trích xuất nhiều phần tử, hãy truyền một vector chỉ số bên trong dấu ngoặc vuông:
numbers <- c(10, 20, 30, 40, 50)
print(numbers[c(1, 3, 5)])Đầu ra:
[1] 10 30 50Bạn cũng có thể dùng toán tử dấu hai chấm để chọn một dải phần tử liên tiếp:
numbers <- c(10, 20, 30, 40, 50)
print(numbers[2:4])Đầu ra:
[1] 20 30 40Chỉ số âm trong R rất hữu ích. Chúng loại trừ các phần tử thay vì chọn chúng:
numbers <- c(10, 20, 30, 40, 50)
print(numbers[-2])Đầu ra:
[1] 10 30 40 50Bạn có thể loại trừ nhiều phần tử bằng cách truyền vào một vector gồm các chỉ số âm:
numbers <- c(10, 20, 30, 40, 50)
print(numbers[-c(1, 5)])Đầu ra:
[1] 20 30 40Hãy nhớ: bạn không thể kết hợp chỉ số dương và chỉ số âm trong cùng một phép chọn. R sẽ báo lỗi nếu bạn thử numbers[c(1, -2)].
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ụ:
100,200,300,400,500,600,700) - Hai chỉ số được phân tách bằng dấu phẩy, biểu thị phạm vi cần loại trừ (ví dụ:
2,5)
Code ban đầu đã đọc đầu vào và tạo véc-tơ số. In ra chính xác bốn dòng theo thứ tự sau:
- In ra các phần tử ở vị trí 1, 3 và 5 bằng cách dùng một véc-tơ chỉ số
- In ra các phần tử từ vị trí 2 đến vị trí 4 bằng toán tử hai chấm
- In ra véc-tơ sau khi loại trừ phần tử ở chỉ số đầu tiên đã cho (dùng chỉ số âm)
- In ra véc-tơ sau khi loại trừ các phần tử từ chỉ số thứ nhất đến chỉ số thứ hai (dùng chỉ số âm với một phạm vi)
Ví dụ, nếu đầu vào là:
10,20,30,40,50,60,70
3,5Đầu ra sẽ là:
[1] 10 30 50
[1] 20 30 40
[1] 10 20 40 50 60 70
[1] 10 20 60 70Giải thích:
- Các phần tử ở vị trí 1, 3, 5 là: 10, 30, 50
- Các phần tử từ vị trí 2 đến 4 là: 20, 30, 40
- Loại trừ vị trí 3 sẽ cho kết quả: 10, 20, 40, 50, 60, 70
- Loại trừ các vị trí từ 3 đến 5 sẽ cho kết quả: 10, 20, 60, 70
Tự làm thử
# Đọc đầu vào
con <- file("stdin", "r")
numbers_input <- suppressWarnings(readLines(con, n = 1))
indices_input <- suppressWarnings(readLines(con, n = 1))
close(con)
# Chuyển các số phân tách bằng dấu phẩy thành một vectơ số
numbers <- as.numeric(strsplit(numbers_input, ",")[[1]])
# Chuyển hai chỉ số thành số
indices <- as.numeric(strsplit(indices_input, ",")[[1]])
idx1 <- indices[1]
idx2 <- indices[2]
# TODO: Viết code của bạn bên dưới
# 1. In ra các phần tử ở vị trí 1, 3 và 5 bằng một vectơ chỉ số
# 2. In ra các phần tử từ vị trí 2 đến vị trí 4 bằng toán tử dấu hai chấm
# 3. In ra vectơ sau khi loại phần tử tại idx1 (dùng chỉ số âm)
# 4. In ra vectơ sau khi loại các phần tử từ idx1 đến idx2 (dùng dải chỉ số âm)Bà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