Menu
CoddyTech

使用 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
challenge icon

挑战

简单

完成 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")
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

逻辑与流程中的所有课

自己练习: R 在线编译器