Menu
CoddyTech

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"
challenge icon

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")
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