В R векторы и кадры данных считаются упорядоченными или неупорядоченными множествами? - PullRequest
3 голосов
/ 13 февраля 2020

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

Проблема в том, что многие люди, приходящие на R, в том числе и те, кого я обучаю, не имеют такого же опыта программирования или работы с базами данных, как у меня. Поэтому очень часто люди видят противоположное предположение, потому что это менее трудоемко и никогда не доставляет им проблем. И, честно говоря, это, вероятно, безопасное предположение, по крайней мере, в случае базы R. Но тогда вы попадаете в пакеты, предоставленные пользователями, которые могут или не могут учитывать то же самое. Учитывая, что предположение никогда не вызывает у них проблем, иногда трудно убедить людей быть осторожными в размышлениях об этих вещах (и в настоящее время я изучаю проблему, хотя и в несколько загадочных случаях, где она может быть актуальной с практической точки зрения для многих людей).

Так что, когда я спорю с этим, одна вещь, которая будет очень полезна, это официальная документация по этому вопросу. Проблема в том, что мне еще не удалось найти явное подтверждение порядка строк в данных в R Определение языка . Одна вещь, которая немного полезна, - это часть в фреймах данных , в которой явно указано, что числа, которые многие люди считают номерами строк, на самом деле являются именами строк (R просто использует числа в качестве разумного значения по умолчанию), и я могу проиллюстрируем, что это не просто номера строк:

> df <- data.frame(a = 5:1, b = 3:7)
> df
  a b
1 5 3
2 4 4
3 3 5
4 2 6
5 1 7
> df2 <- df[-3, ]
> df2
  a b
1 5 3
2 4 4
4 2 6
5 1 7
> 

Но есть ли что-нибудь более формальное доступное? Что-то вроде «пользователи не должны предполагать, что кадры данных имеют неявный порядок»? Или, наоборот, есть ли что-нибудь, что явно указывает, что пользователи могут зависеть от порядка строк в кадрах данных, по крайней мере, для базы R?

1 Ответ

0 голосов
/ 13 февраля 2020

Я прочитал много R документов, но не видел ничего формального, записанного о неупорядоченных или неупорядоченных наборах данных. Нельзя сказать, что это где-то не написано, поскольку документация довольно обширна.

Я преподавал концепции баз данных студентам в течение многих лет и всегда говорю им, что таблицы не имеют определенного порядка, кроме порядка ввода данных, который обычно не имеет значения для конечного пользователя. То же самое для результатов запросов. Когда я преподаю R, я говорю им то же самое для фреймов данных - порядок строк не имеет особого значения, кроме как сказать, что именно так записи могли быть введены изначально. Имена строк, нравятся они вам или нет, являются атрибутом фрейма данных, и их не следует путать с порядковым номером строки, хотя они могут быть одинаковыми.

Теперь, некоторые пользовательские материалы авторы пакетов несколько замутили воду специальными типами фреймов данных, примером тому служит tbl_df из пакета tibble. Где атрибут rownames «data.frame» сохраняется, когда берется подмножество, имена строк для «tbl» - нет. Следующий пример демонстрирует:

> df <- data.frame(a = 5:1, b = 3:7)
> df
  a b
1 5 3
2 4 4
3 3 5
4 2 6
5 1 7

> df[2,]
  a b
2 4 4

> rownames(df[2,])
[1] "2"

> library(tibble)
> dt <- as_tibble(df)
> dt
# A tibble: 5 x 2
      a     b
  <int> <int>
1     5     3
2     4     4
3     3     5
4     2     6
5     1     7

> dt[2,]
# A tibble: 1 x 2
      a     b
  <int> <int>
1     4     4

> rownames(dt[2,])
[1] "1"

Мне нравятся тиблы. Одна из приятных особенностей, и их много, заключается в том, что имена строк имеют более светлый оттенок серого (вы не можете видеть это здесь). Таким образом, новые пользователи R могут видеть, что они не являются переменными в данных, но они есть, возможно для какой-то полезной цели, которая может быть не сразу очевидна. Я говорю своим ученикам, что имена строк не обязательно являются индексом и не слишком беспокоятся об именах строк или порядке их размещения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...