看起来你真正想要的是绘制一个子集。根据数据的形式(向量、矩阵、数据框、列表;数字、逻辑、字符),您子集数据的方式会有所不同。这将适用于像 data(quake) 这样的数字数据框。
首先您需要了解[] 的功能。如果您在帮助中搜索Extract,您将找到有关它及其兄弟姐妹的信息。 [] 用于从任意维度的向量、矩阵、数据帧和数组中提取元素,基于每个维度的索引,每个维度用逗号分隔。
假设你有一个向量vec <- c(1, 3, 2, 6, 4)。向量只有一个维度,因此您不必担心要处理的维度。 vec[3] 将返回 2,向量中的位置值或索引 3,从左边数第三个元素。 vec[5] 将返回第五个元素:4,而vec[c(2, 1, 4)] 将按顺序返回第二个、第一个和第四个元素。
在处理矩阵和数据帧时,我们处理的是二维,通常称为行和列。使用[] 时,维度将始终像这样分开:[rows, columns]。让我们创建一个矩阵。
mat <- matrix(c(9, 8, 7
6, 5, 4
3, 2, 1), nrow=3, byrow=TRUE)
mat
# [,1] [,2] [,3]
# [1,] 9 8 7
# [2,] 6 5 4
# [3,] 3 2 1
在顶部和底部有[],其中的数字表示每个维度的索引。您还会注意到,数字在逗号前面,表示行,而在顶部,数字在逗号后面,表示列。
如果我打电话给mat[3, ] 或mat[, 2] 会发生什么?好吧,我得到了相应行或列中的每个元素。
如果我们想提取上面矩阵中的4呢?那么它的行是nr 2,它的列是nr 3,所以它可以简单地是mat[2, 3]吗?为什么是的,它是!
我们现在差不多了,唯一要展示的是我们可以按名称引用行和列,而不仅仅是按索引。上面的矩阵没有任何维度名称,所以我们必须添加它们。
rownames(mat) <- c("r1", "r2", "r3")
colnames(mat) <- c("c1", "c2", "c3")
mat
# c1 c2 c3
# r1 9 8 7
# r2 6 5 4
# r3 3 2 1
现在mat[,"c2"] 将返回名为c2 的列,mat["r1"] 将返回名为r1 的行。
转至quakes。
假设我们要绘制震源深度超过 400 公里的所有地震。
提取该子集的一种直接方法是
quakes.sub <- quakes[quakes[,"depth"] > 400, c("long", "lat")]
这里唯一的新事物是>,在这种情况下会询问:“quakes[,"depth"] 中的值是否大于 400?”。对于每一个“是”返回一个TRUE,对于每一个“否”返回一个FALSE。只有返回 TRUE 的列才会包含在子集中。
要绘制子集,您只需
plot(quakes.sub)
这当然只是开始。可以使用with()避免多次输入quakes,使用which()会更优雅地处理NA,条件(<、>、==)可以叠加使用逻辑运算符(不是:!,和:&,或:|),允许更高级的子集规则。
rows <- with(quakes, which(depth < 400 &
depth > 100 &
mag > 4.3 &
stations > 20))
quakes.sub <- quakes[rows, c("long", "lat")]
plot(quakes.sub)