Nhóm bằng split()
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 39 trên 64.
split(values, groups) đưa mỗi giá trị vào nhóm có tên trùng với phần tử tương ứng trong groups. Kết quả là một danh sách có một phần tử cho mỗi nhóm, được đặt tên theo các nhóm đã sắp xếp:
amounts <- c(10, 20, 30, 40)
category <- c("food", "rent", "food", "fun")
by_cat <- split(amounts, category)
print(names(by_cat))
print(by_cat[["food"]])Đầu ra:
[1] "food" "fun" "rent"
[1] 10 30Kết hợp split() với sapply() để tính một giá trị tổng hợp cho mỗi nhóm:
amounts <- c(10, 20, 30, 40)
category <- c("food", "rent", "food", "fun")
by_cat <- split(amounts, category)
print(sapply(by_cat, sum))
print(sapply(by_cat, length))Đầu ra:
food fun rent
40 40 20
food fun rent
2 1 1 Các giá trị cũng có thể là văn bản, ví dụ để nhóm tên theo chữ cái đầu tiên:
names <- c("ana", "bo", "al", "bea", "cy")
groups <- split(names, substr(names, 1, 1))
for (letter in names(groups)) {
cat(letter, ":", paste(groups[[letter]], collapse = ", "), "\n")
}Đầu ra:
a : ana, al
b : bo, bea
c : cy Một nhóm chỉ tồn tại khi có ít nhất một giá trị thuộc về nhóm đó, vì vậy hãy kiểm tra bằng %in% names() trước khi đọc một nhóm có thể trống:
by_cat <- split(c(5, 7), c("food", "food"))
print("rent" %in% names(by_cat))Đầu ra:
[1] FALSEThử thách
DễHoàn thiện category_totals(amounts, categories). Trả về một dòng cho mỗi danh mục theo thứ tự bảng chữ cái, food: 40 (2 items), kèm tổng số tiền và số lượng khoản tiền thuộc danh mục đó.
Đoạn code được cung cấp đọc số tiền và danh mục từ hai dòng được phân tách bằng dấu phẩy có độ dài bằng nhau, rồi in ra từng dòng được trả về.
Tự làm thử
category_totals <- function(amounts, categories) {
# 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(category_totals(as.numeric(strsplit(input[1], ",")[[1]]), 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