Menu
CoddyTech

Toán tử %in%

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 70 trên 78.

Đôi khi bạn cần kiểm tra xem các giá trị có tồn tại trong một vector hay không. Toán tử %in% cung cấp một cách đơn giản để kiểm tra phần tử có thuộc vector hay không, trả về TRUE cho mỗi phần tử khớp và FALSE trong các trường hợp còn lại.

Cú pháp cơ bản kiểm tra xem các giá trị ở bên trái có tồn tại trong vector ở bên phải hay không:

fruits <- c("apple", "banana", "cherry")
print("banana" %in% fruits)

Đầu ra:

[1] TRUE

Bạn cũng có thể kiểm tra nhiều giá trị cùng lúc. Toán tử trả về một véc-tơ logic, với một kết quả cho mỗi giá trị được kiểm tra:

fruits <- c("apple", "banana", "cherry")
check <- c("banana", "grape", "apple")
print(check %in% fruits)

Đầu ra:

[1]  TRUE FALSE  TRUE

Điều này khiến %in% rất phù hợp để lọc. Kết hợp với lập chỉ mục logic, bạn có thể trích xuất các phần tử thuộc một tập hợp cụ thể:

numbers <- c(1, 5, 3, 8, 2, 9)
allowed <- c(1, 2, 3)
print(numbers[numbers %in% allowed])

Đầu ra:

[1] 1 3 2

Toán tử %in% đặc biệt hữu ích khi xác thực đầu vào của người dùng hoặc lọc dữ liệu dựa trên danh sách giá trị được chấp nhận đã xác định trước.

challenge icon

Thử thách

Dễ

Bạn sẽ nhận ba dòng đầu vào:

  1. Danh sách các mặt hàng trong kho của bạn, phân tách bằng dấu phẩy (ví dụ: apple,banana,milk,bread,eggs,cheese)
  2. Danh sách các mặt hàng trong danh sách mua sắm của bạn, phân tách bằng dấu phẩy (ví dụ: milk,butter,eggs,juice)
  3. Danh sách các mặt hàng đang giảm giá, phân tách bằng dấu phẩy (ví dụ: bread,juice,yogurt)

Dùng toán tử %in%:

  1. Tạo các vector ký tự từ mỗi dòng đầu vào được phân tách bằng dấu phẩy
  2. Kiểm tra những mặt hàng nào trong danh sách mua sắm đã có trong kho của bạn và in ra kết quả dạng vector logic
  3. Lọc và in ra những mặt hàng trong danh sách mua sắm mà bạn CHƯA có trong kho (những mặt hàng bạn cần mua)
  4. Lọc và in ra những mặt hàng bạn cần mua đang giảm giá

Ví dụ, nếu đầu vào là:

apple,banana,milk,bread,eggs
milk,butter,eggs,juice,apple
bread,juice,yogurt,butter

Đầu ra sẽ là:

[1]  TRUE FALSE  TRUE FALSE  TRUE
[1] "butter" "juice" 
[1] "butter" "juice"

Giải thích:

  • Danh sách mua sắm được kiểm tra với kho: milk (TRUE), butter (FALSE), eggs (TRUE), juice (FALSE), apple (TRUE)
  • Các mặt hàng KHÔNG có trong kho (cần mua): butter, juice
  • Các mặt hàng cần mua đang giảm giá: butter và juice đều có trong danh sách giảm giá

Dùng toán tử ! cùng với %in% để tìm những mặt hàng KHÔNG có trong một vector.

Tự làm thử

# Đọc đầu vào
con <- file("stdin", "r")
inventory_input <- suppressWarnings(readLines(con, n = 1))
shopping_list_input <- suppressWarnings(readLines(con, n = 1))
sale_items_input <- suppressWarnings(readLines(con, n = 1))
close(con)

# TODO: Viết code bên dưới
# 1. Dùng strsplit() tạo các vectơ ký tự từ từng đầu vào được phân tách bằng dấu phẩy
# 2. Kiểm tra mặt hàng nào trong danh sách mua sắm đã có trong kho (dùng %in%)
# 3. Lọc các mặt hàng trong danh sách mua sắm chưa có trong kho (dùng ! với %in%)
# 4. Lọc các mặt hàng bạn cần mua và đang giảm giá
quiz iconTự kiểm tra

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

Tự luyện tập: Trình biên dịch R online