Menu
CoddyTech

集合运算

本课属于 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
challenge icon

挑战

简单

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

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

逻辑与流程中的所有课

自己练习: R 在线编译器