使用 split() 分组
本课属于 Coddy R 学习旅程的“逻辑与流程”单元。第 39 课,共 64 课。
split(values, groups) 会将每个值放入由 groups 中对应元素命名的组。结果是一个列表,每个组对应一个元素,并按组名排序:
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"]])输出:
[1] "food" "fun" "rent"
[1] 10 30结合使用 split() 和 sapply(),为每个组计算一项汇总:
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))输出:
food fun rent
40 40 20
food fun rent
2 1 1 值也可以是文本,例如按名字的首字母分组:
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")
}输出:
a : ana, al
b : bo, bea
c : cy 只有至少有一个值属于某个组时,该组才会存在。因此,在读取可能为空的组之前,先用 %in% names() 检查:
by_cat <- split(c(5, 7), c("food", "food"))
print("rent" %in% names(by_cat))输出:
[1] FALSE挑战
简单完成 category_totals(amounts, categories)。按字母顺序为每个类别返回一行,其中包含该类别的金额总和以及金额数量 food: 40 (2 items)。
提供的代码会读取两行以逗号分隔且长度相同的金额和类别数据,并打印返回的每一行。
亲手试试
category_totals <- function(amounts, categories) {
# 在这里编写你的代码
character(0)
}
# 已提供的输入/输出代码:保持原样
input <- suppressWarnings(readLines(file("stdin")))
cat(category_totals(as.numeric(strsplit(input[1], ",")[[1]]), strsplit(input[2], ",")[[1]]), sep = "\n")
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
逻辑与流程中的所有课
自己练习: R 在线编译器