集合运算
本课属于 Coddy R 学习旅程的“逻辑与流程”单元。第 13 课,共 64 课。
有三个函数可以把两个向量合并为集合。每个函数返回的值都不重复:
union(a, b) 包含任一向量中的值,intersect(a, b) 包含两个向量中的值,而 setdiff(a, b) 包含 a 中不在 b 中的值。
mon <- c("ana", "ben", "cy")
tue <- c("ben", "dee", "cy", "ben")
print(union(mon, tue))
print(intersect(mon, tue))
print(setdiff(mon, tue))输出:
[1] "ana" "ben" "cy" "dee"
[1] "ben" "cy"
[1] "ana"setdiff()取决于参数的顺序。交换它们,就能得到仅存在于第二个向量中的值:
mon <- c("ana", "ben", "cy")
tue <- c("ben", "dee", "cy")
print(setdiff(tue, mon))输出:
[1] "dee"没有剩下任何内容时,结果是一个空向量。对于文本,结果为 character(0):
print(intersect(c("a", "b"), c("x", "y")))输出:
character(0)结果会保留第一个向量的顺序。如果输出需要顺序固定,请对结果排序,并在拼接前检查结果是否为空:
a <- c("pear", "fig", "kiwi")
b <- c("kiwi", "pear")
both <- sort(intersect(a, b))
print(paste(both, collapse = ", "))
print(length(setdiff(b, a)) == 0)输出:
[1] "kiwi, pear"
[1] TRUE挑战
简单完成 compare_courses(a, b)。a 和 b 分别是两门课程的学生。返回三行:
Both:后面跟两门课程都有的学生Only first:后面跟只在a中的学生Total:后面跟两门课程中不同学生的数量
对每个列表中的姓名排序,并用 , 连接。空列表写作 none。
提供的代码会将两门课程读取为逗号分隔的行,并打印返回的每一行。
亲手试试
compare_courses <- function(a, b) {
# 在这里编写你的代码
c("Both: ", "Only first: ", "Total: 0")
}
# 提供的输入和输出代码:保持原样
input <- suppressWarnings(readLines(file("stdin")))
cat(compare_courses(strsplit(input[1], ",")[[1]], strsplit(input[2], ",")[[1]]), sep = "\n")
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
逻辑与流程中的所有课
自己练习: R 在线编译器