Menu
CoddyTech

ifelse() dạng vector hóa

Thuộc phần Logic và luồng điều khiển trong hành trình R của Coddy. Bài học 48 trên 64.

if kiểm tra một điều kiện. Khi nhận một vector gồm nhiều giá trị, nó dừng và báo lỗi the condition has length > 1. ifelse(test, yes, no) xử lý từng phần tử và trả về một kết quả cho mỗi phần tử:

temps <- c(12, 25, 31, 18)
print(ifelse(temps > 20, "warm", "cool"))

Đầu ra:

[1] "cool" "warm" "warm" "cool"

yes và no có thể là các vectơ có cùng độ dài, vì vậy mỗi phần tử có thể nhận một giá trị được tính riêng:

price <- c(40, 120, 75)
final <- ifelse(price > 100, price * 0.9, price)
print(final)

Đầu ra:

[1]  40 108  75

Lồng các lần gọi ifelse() để xử lý hơn hai kết quả. Các điều kiện được kiểm tra theo thứ tự cho từng phần tử:

scores <- c(95, 72, 48, 81)
grade <- ifelse(scores >= 90, "A", ifelse(scores >= 70, "B", "C"))
print(grade)

Đầu ra:

[1] "A" "B" "C" "B"

ifelse() hữu ích khi tạo cột mới cho khung dữ liệu, trong đó mỗi hàng cần nhãn riêng:

df <- data.frame(item = c("tea", "oil"), stock = c(0, 8))
df$status <- ifelse(df$stock == 0, "sold out", "available")
print(df)

Đầu ra:

  item stock    status
1  tea     0  sold out
2  oil     8 available
challenge icon

Thử thách

Dễ

Hoàn thiện shipping(weights). Trả về phí vận chuyển của từng kiện hàng, nối các giá trị bằng , : kiện hàng nặng tối đa 1 kg có phí 4, tối đa 5 kg có phí 9, còn kiện hàng nặng hơn có phí 2 cho mỗi kg. Dùng ifelse(), không dùng vòng lặp.

Code được cung cấp đọc cân nặng từ một dòng, các giá trị được phân tách bằng dấu phẩy, rồi in ra giá trị được trả về.

Tự làm thử

shipping <- function(weights) {
  # Viết code của bạn ở đây
  ""
}

# Đoạn code đầu vào và đầu ra được cung cấp sẵn: giữ nguyên
input <- suppressWarnings(readLines(file("stdin")))
cat(shipping(as.numeric(strsplit(input[1], ",")[[1]])), sep = "\n")
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 Logic và luồng điều khiển

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