【发布时间】:2020-02-21 22:25:37
【问题描述】:
假设,我正确理解[[ 的文档,可以使用矩阵来对data.frame 进行子集化:
第三种索引形式是通过数字矩阵,每个维度有一列:索引矩阵的每一行然后选择数组的单个元素,结果是一个向量。索引矩阵中不允许有负索引。允许使用 NA 和零值:索引矩阵中包含零的行将被忽略,而包含 NA 的行会在结果中产生 NA。
虽然这适用于 [,但我很难理解如何使用 [[ 做到这一点。
mtcars[1:6, 1:6]
#> mpg cyl disp hp drat wt
#> Mazda RX4 21.0 6 160 110 3.90 2.620
#> Mazda RX4 Wag 21.0 6 160 110 3.90 2.875
#> Datsun 710 22.8 4 108 93 3.85 2.320
#> Hornet 4 Drive 21.4 6 258 110 3.08 3.215
#> Hornet Sportabout 18.7 8 360 175 3.15 3.440
#> Valiant 18.1 6 225 105 2.76 3.460
(ind <- matrix(1:6, ncol = 2))
#> [,1] [,2]
#> [1,] 1 4
#> [2,] 2 5
#> [3,] 3 6
mtcars[ind]
#> [1] 110.00 3.90 2.32
mtcars[[ind]]
#> Error in as.matrix(x)[[i]]: attempt to select more than one element in vectorIndex
这是一个错误吗?还是我误解了文档?
这里是[[.data.frame(v3.6.1)的来源
function (x, ..., exact = TRUE)
{
na <- nargs() - !missing(exact)
if (!all(names(sys.call()) %in% c("", "exact")))
warning("named arguments other than 'exact' are discouraged")
if (na < 3L)
(function(x, i, exact) if (is.matrix(i))
as.matrix(x)[[i]]
else .subset2(x, i, exact = exact))(x, ..., exact = exact)
else {
col <- .subset2(x, ..2, exact = exact)
i <- if (is.character(..1))
pmatch(..1, row.names(x), duplicates.ok = TRUE)
else ..1
col[[i, exact = exact]]
}
}
【问题讨论】:
-
[[ 形式只允许使用整数或字符索引选择单个元素,....
-
@NelsonGon 你能解释一下我的问题是如何与链接问题重复的吗?我很清楚
[和[[之间的一般差异。我在问,是否可以使用[[和用于索引的矩阵对data.frame进行子集化。你能告诉我在链接的问题中究竟在哪里回答。我找不到与我的确切问题相关的任何内容。 -
您好,抱歉,我通常会链接到可能的重复项,如果 OP 或其他人认为它是重复项,则将其关闭。虽然您需要使用矩阵进行索引,但 R 的
[[仅支持单个元素,因此您不能使用链接问题所述的[[。您可以在概念上将矩阵索引映射到[[并使用它。如果您觉得结束措辞恰当的问题令人反感,我们深表歉意。 -
@NelsonGon 我没有被冒犯。我根本不明白你是如何帮助我的问题的。您唯一的论点是来自 R-lang 的一句话,我认为这不是答案。从某种意义上说,我的建议正是 R-lang 在该主题上所说的:我正在使用数字索引选择元素。
-
好吧,我可能错了,但子集
1:6和1:6与使用1:6和 2 列构建的矩阵不同。无论如何,实际用例是什么样的?我的意思是子集有几种替代方法。