R одноэлементное подмножество (aka `[[`) с использованием матрицы - PullRequest
2 голосов
/ 25 октября 2019

Предполагая, что я правильно понимаю документацию [[, можно использовать матрицу для подстановки 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]]
    }
}

1 Ответ

1 голос
/ 25 октября 2019

На странице документа (?Extract), на которую вы ссылаетесь, сказано, что массивы могут быть проиндексированы матрицами. Неявно, я понимаю, что не-массивы не могут быть индексированы матрицами. Кадры данных не являются массивами, поэтому они не могут быть проиндексированы матрицами. (Матрицы являются массивами, конечно.)


Я думаю, что вы неправильно истолковываете документацию. Вы просматриваете страницу документации, которая совместно документирует [, [[ и $ вместе. В описании аргумента говорится:

. При индексировании массивов с помощью [ один аргумент i может представлять собой матрицу с таким количеством столбцов, сколько имеется измерений x ... * 1016. *

Раздел, который вы цитируете в верхней части вашего вопроса, появится позже под заголовком Matrices and Arrays, который я считаю разделом о подмножестве матриц и массивов, а не об использованииматрицы как индексы. (Посмотрите остальную часть раздела и разделы до и после, и я думаю, что вы согласитесь со мной.)

Нигде на этой странице документации не говорится об использовании матриц в качестве индексов для[[.

Я удивлен, что он обрабатывается специально в показанном вами [[ коде - но, насколько я могу судить, матрица, заданная для [[.data.frame, выдаст ошибку, если только она не будет 1x1матрица, в этом случае фрейм данных обрабатывается как матрица, а один элемент возвращается по какой-то непонятной причине (вероятно, «совместимость с S», хотя я не могу догадаться, почему S допускает это).

...