Почему индексация «вне границ» отличается между матрицей и data.frame? - PullRequest
0 голосов
/ 23 ноября 2018

Я уверен, что это довольно просто, но я бы хотел действительно понять логику структур данных R. Здесь

Если я подставлю матрицу по индексу изя получаю именно эту ошибку:

m <- matrix(data = c("foo", "bar"), nrow = 1)
m[2,]
# Error in m[2, ] : subscript out of bounds

Если я делаю то же самое, делаю фрейм данных, однако я получаю все NA строки :

df <- data.frame(foo = "foo", bar = "bar")
df[2,]
#    foo  bar
# NA <NA> <NA>

Если я помещаю в несуществующий фрейм данных столбец , я получаю знакомое

df[, 3]
# Error in `[.data.frame`(df, , 3) : undefined columns selected

Я знаю (примерно), что строки фрейма данных странные и требуют осторожного обращения,но я не совсем вижу связь с вышеуказанным поведением.

Может кто-нибудь объяснить , почему R ведет себя таким образом для несуществующих строк df?

Обновление

Конечно, значение NA для подмножеств вне границ - это нормальное R поведение для одномерных векторов:

vec <- c("foo", "bar")
vec[3]
# [1] NA

Таким образом, в некотором смысле, странный из здесь - это матричное подмножество, а не подмножество данных, в зависимости от того, с чего вы начинаете.Тем не менее, другое поведение двумерного поднабора (m[2, ] против df[2, ]) может показаться непоследовательным для плотного пользователя (как я сейчас).

1 Ответ

0 голосов
/ 12 мая 2019

Может ли кто-нибудь объяснить, почему R ведет себя так [?]

Краткий ответ: Нет, вероятно, нет.


Более длинный ответ: ОднаждыВ тот раз, когда я думал о чем-то подобном и прочитал эту тему на R-devel: Определение [[.В основном это сводится к следующему:

Семантика [ и [[ не полностью указана в Справочном руководстве .[...] Я предполагаю, что это функции, а не ошибки, но я не могу найти для них документацию

Дункан Мердок, бывший член основной команды R, дает очень хорошую оценку ответить :

На странице руководства есть дополнительная документация для Extract, но я думаю, что она неполная.Самой полной документацией, конечно, является исходный код *, но может не дать ответа на вопрос о том, что является преднамеренным и случайным

Как уже упоминалось в потоке R-devel,Единственное описание в руководстве: 3.4.1 Индексирование по векторам :

Если i положительно и превышает length(x), то соответствующий выбор равен NA

Но это относится к "индексации простых векторов".Подобное индексирование вне границ для «непростых» векторов, по-видимому, не описано.Дункан Мердок снова:

Так что же такое простой вектор?Это явно не определено, и, вероятно, должно быть.

Таким образом, может показаться, что никто не знает ответа на ваш почему вопрос.


См. Также «8.2.13 несуществующее значение в нижнем индексе» в превосходном R Inferno Патрика Бернса и раздел «Индексы отсутствия / выхода за пределы» в книге Хэдли .


* Исходный код для оператора подмножества [ .Поиск по R_MSG_subs_o_b (что соответствует сообщению об ошибке «индекс за пределами» ) не дает очевидного объяснения, почему OOB [ при индексировании матриц и при использовании [[ выдает ошибку, тогда как OOB [ индексирование «простых векторов» приводит к NA.

...