【问题标题】:R single element subsetting (aka `[[`) using a matrix使用矩阵的 R 单元素子集(又名 `[[`)
【发布时间】: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:61:6 与使用 1:6 和 2 列构建的矩阵不同。无论如何,实际用例是什么样的?我的意思是子集有几种替代方法。

标签: r dataframe matrix subset


【解决方案1】:

您引用的文档页面 (?Extract) 说数组可以由矩阵索引。隐含地,我认为这意味着非数组不能被矩阵索引。数据框不是数组,因此它们不能被矩阵索引。 (当然,矩阵是数组。)


我确实认为您误解了文档。您正在查看一个文档页面,该页面共同记录了 [[[$。在参数描述中,它说

当通过[ 索引数组时,单个参数i 可以是一个矩阵,其列数与x 的维数一样多...

您在问题顶部引用的部分稍后会出现在标题矩阵和数组下,我认为这是关于 subsetting 矩阵和数组的部分,而不是关于使用矩阵作为索引. (看看剩下的部分,以及之前和之后的部分,我想你会同意我的。)

该文档页面上没有提到使用矩阵作为索引[[

我很惊讶它在您显示的 [[ 代码中进行了特殊处理 - 但据我所知,给 [[.data.frame 的矩阵将出错,除非它是一个 1x1 矩阵,在这种情况下处理数据帧作为一个矩阵并返回单个元素,出于某种神秘的原因(可能是“与 S 的兼容性”,尽管我不知道为什么 S 会允许它)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-08
    • 1970-01-01
    • 1970-01-01
    • 2017-05-09
    • 2021-12-31
    • 1970-01-01
    • 1970-01-01
    • 2020-06-08
    相关资源
    最近更新 更多