向量切片与索引
本课属于 Coddy R 学习旅程的“基础知识”单元。第 67 课,共 78 课。
你已经学会了如何访问单个元素,以及如何遍历向量。现在,我们来看看如何使用切片一次提取多个元素。这种方法可以让你通过一次操作获取向量的一个子集。
要提取多个元素,请在方括号内传入一个索引向量:
numbers <- c(10, 20, 30, 40, 50)
print(numbers[c(1, 3, 5)])输出:
[1] 10 30 50你还可以使用冒号运算符选择一段连续的元素:
numbers <- c(10, 20, 30, 40, 50)
print(numbers[2:4])输出:
[1] 20 30 40负索引在 R 中很有用。它们可以排除元素,而不是选取元素:
numbers <- c(10, 20, 30, 40, 50)
print(numbers[-2])输出:
[1] 10 30 40 50你可以通过传入一个由负索引组成的向量来排除多个元素:
numbers <- c(10, 20, 30, 40, 50)
print(numbers[-c(1, 5)])输出:
[1] 20 30 40请记住:在同一次选取中,不能混用正索引和负索引。如果你尝试使用 numbers[c(1, -2)],R 会报错。
挑战
简单你会收到两行输入:
- 以逗号分隔的数字列表(例如,
100,200,300,400,500,600,700) - 两个用逗号分隔的索引,表示要排除的范围(例如,
2,5)
起始代码已经读取输入并创建了数值向量。请按以下顺序准确打印四行:
- 使用索引向量打印位置 1、3 和 5 的元素
- 使用冒号运算符打印位置 2 到位置 4 的元素
- 打印排除第一个给定索引处元素后的向量(使用负索引)
- 打印排除从第一个索引到第二个索引处元素后的向量(使用负索引和范围)
例如,如果输入是:
10,20,30,40,50,60,70
3,5输出应为:
[1] 10 30 50
[1] 20 30 40
[1] 10 20 40 50 60 70
[1] 10 20 60 70说明:
- 位置 1、3、5 处的元素是:10、30、50
- 位置 2 到 4 处的元素是:20、30、40
- 排除位置 3 后得到:10、20、40、50、60、70
- 排除位置 3 到 5 后得到:10、20、60、70
亲手试试
# 读取输入
con <- file("stdin", "r")
numbers_input <- suppressWarnings(readLines(con, n = 1))
indices_input <- suppressWarnings(readLines(con, n = 1))
close(con)
# 将以逗号分隔的数字解析为数值向量
numbers <- as.numeric(strsplit(numbers_input, ",")[[1]])
# 解析两个索引
indices <- as.numeric(strsplit(indices_input, ",")[[1]])
idx1 <- indices[1]
idx2 <- indices[2]
# TODO: 在下方编写代码
# 1. 使用索引向量打印位置 1、3 和 5 的元素
# 2. 使用冒号运算符打印位置 2 到 4 的元素
# 3. 打印排除 idx1 位置元素后的向量(负索引)
# 4. 打印排除 idx1 到 idx2 位置元素后的向量(使用范围进行负索引)这节课包含一个小测验。开始学习即可作答,并记录你的进度。
基础知识中的所有课
自己练习: R 在线编译器