Tóm tắt nhóm
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 40 trên 64.
tapply(values, groups, f) nhóm các giá trị rồi áp dụng f cho từng nhóm chỉ trong một lần gọi. Hàm này cho kết quả giống với sapply(split(values, groups), f):
amounts <- c(10, 20, 30, 40)
category <- c("food", "rent", "food", "fun")
print(tapply(amounts, category, sum))
print(tapply(amounts, category, max))Đầu ra:
food fun rent
40 40 20
food fun rent
30 40 20 Kết quả được đặt tên theo nhóm theo thứ tự đã sắp xếp, vì vậy [[ ]] đọc một nhóm và names() liệt kê các nhóm:
amounts <- c(10, 20, 30, 40)
category <- c("food", "rent", "food", "fun")
avg <- tapply(amounts, category, mean)
print(avg[["food"]])
print(names(avg))Đầu ra:
[1] 20
[1] "food" "fun" "rent"Hàm tính toán có thể là hàm do bạn tự viết. Ở đây, hàm này đếm số đơn hàng trên 25 trong mỗi nhóm:
amounts <- c(10, 20, 30, 40)
category <- c("food", "rent", "food", "fun")
print(tapply(amounts, category, function(v) sum(v > 25)))Đầu ra:
food fun rent
1 1 0 Kết quả là một vector có tên, vì vậy sort() và which.max() tìm nhóm lớn nhất. which.max() trả về phần tử đầu tiên nếu có các giá trị bằng nhau:
amounts <- c(10, 20, 30, 40, 5)
category <- c("food", "rent", "food", "fun", "rent")
totals <- tapply(amounts, category, sum)
print(names(totals)[which.max(totals)])
print(names(sort(totals, decreasing = TRUE)))Đầu ra:
[1] "food"
[1] "food" "fun" "rent"Thử thách
DễHoàn thiện city_report(cities, temps). Trả về một dòng cho mỗi thành phố theo thứ tự bảng chữ cái, oslo: avg 4.5, max 9, với nhiệt độ trung bình được làm tròn đến một chữ số thập phân và nhiệt độ cao nhất. Sau đó thêm Warmest: theo sau là thành phố có nhiệt độ trung bình cao nhất (chọn thành phố đứng đầu theo thứ tự bảng chữ cái nếu các mức trung bình bằng nhau).
Code được cung cấp đọc tên các thành phố và nhiệt độ từ hai dòng có độ dài bằng nhau, các giá trị được phân tách bằng dấu phẩy, rồi in ra từng dòng được trả về.
Tự làm thử
city_report <- function(cities, temps) {
# Viết code của bạn ở đây
character(0)
}
# Đoạn code đầu vào/đầu ra có sẵn: giữ nguyên
input <- suppressWarnings(readLines(file("stdin")))
cat(city_report(strsplit(input[1], ",")[[1]], as.numeric(strsplit(input[2], ",")[[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