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 75Lồ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 availableThử 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")
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
1Chuỗi chuyên sâu
Chuỗi con với substr()Định dạng với sprintf()Tách và nối chuỗiTìm kiếm trong chuỗiThay thế văn bảnÔn tập: Tạo tên người dùng10Luồng điều khiển nâng cao
Hàm switch()ifelse() dạng vector hóarepeat và breakHàm đệ quyÔn tập: phân loại điểmTự luyện tập: Trình biên dịch R online