Я только начал использовать R и наткнулся на data.table. Я нашел его блестящим.
Очень наивный вопрос: могу ли я игнорировать data.frame для использования data.table, чтобы избежать путаницы синтаксиса между двумя пакетами?
Я только начал использовать R и наткнулся на data.table. Я нашел его блестящим.
Очень наивный вопрос: могу ли я игнорировать data.frame для использования data.table, чтобы избежать путаницы синтаксиса между двумя пакетами?
Как подчеркивается в FAQ 1.1,
jв[.data.tableпринципиально отличается отjв[.data.frame. Даже так просто, какDF[,1]сломает существующий код во многих пакетах и код пользователя. Это сделано специально, и мы хотим, чтобы это работало сложный синтаксис для работы. Есть и другие отличия (см. FAQ 2,17).Кроме того,
data.tableнаследуется отdata.frame. Этоdata.frameтоже.data.tableможет быть передан любому пакету, который принимает толькоdata.frame, и этот пакет может использовать[.data.frameсинтаксис вdata.table.Мы также предложили улучшения для R, где это возможно. Один из они были приняты в качестве новой функции в R 2.12.0:
unique()иmatch()теперь работают быстрее на символьных векторах, где все элементы находятся в глобальном кэшеCHARSXPи не отмечены кодирование (ASCII). Спасибо Мэтью Доул за предложение улучшения к тому, как хеш-код генерируется вunique.c.Второе предложение заключалось в использовании
memcpyвduplicate.c, что значительно быстрее, чем цикл for в C. Это улучшит способ, которым R копирует данные внутренне (по некоторым показателям в 13 раз). Нить на р-девел здесь: http://tolstoy.newcastle.edu.au/R/e10/devel/10/04/0148.html.
data.frame и data.table
DT[3]относится к 3-й строке, ноDF[3]относится к 3-му столбцуDT[3, ] == DT[3], ноDF[ , 3] == DF[3](несколько запутанно в data.frame, тогда как data.table согласован)- По этой причине мы говорим, что запятая необязательна в
DT, но не обязательна вDFDT[[3]] == DF[, 3] == DF[[3]]DT[i, ], гдеi- одно целое число, возвращает одну строку, как иDF[i, ], но в отличие от подмножества матрицы, состоящего из одной строки, которое возвращает вектор.DT[ , j]гдеj- одно целое число, возвращает таблицу data.table с одним столбцом, в отличие отDF[, j], который возвращает вектор по умолчаниюDT[ , "colA"][[1]] == DF[ , "colA"].DT[ , colA] == DF[ , "colA"](в настоящее время в data.table v1.9.8, но собирается измениться, см. заметки о выпуске)DT[ , list(colA)] == DF[ , "colA", drop = FALSE]DT[NA]возвращает 1 строкуNA, ноDF[NA]возвращает всю копиюDF, содержащуюNA. СимволNAимеет типlogicalв R и поэтому перерабатывается[.data.frame. Вероятно, намерение пользователя былоDF[NA_integer_].[.data.tableавтоматически переключается на это вероятное намерение для удобства.DT[c(TRUE, NA, FALSE)]обрабатываетNAкакFALSE, ноDF[c(TRUE, NA, FALSE)]возвращаетNAстрок для каждогоNADT[ColA == ColB]проще, чемDF[!is.na(ColA) & !is.na(ColB) & ColA == ColB, ]data.frame(list(1:2, "k", 1:4))создает 3 столбца, data.table создает один столбецlist.check.namesпо умолчаниюTRUEвdata.frame, ноFALSEв data.table для удобства.stringsAsFactorsпо умолчаниюTRUEвdata.frame, ноFALSEв data.table для эффективности. Поскольку к R был добавлен глобальный строковый кеш, символьные элементы являются указателем на одну кешированную строку, и при преобразовании вfactorвыигрыша в производительности больше нет.- Атомные векторы в столбцах
listсвернуты при печати с использованием", "вdata.frame, но","в data.table с запятой после 6-го элемента, чтобы избежать случайной печати больших вложенных объектов. В[.data.frameмы очень часто устанавливаемdrop = FALSE. Когда мы забываем, ошибки могут возникать в крайних случаях, когда выбираются отдельные столбцы и внезапно возвращается вектор, а не один столбецdata.frame. В[.data.tableмы воспользовались возможностью, чтобы сделать его последовательным, и отбросилиdrop. Когда data.table передается в пакет data.table-unaware, этот пакет не связан ни с одним из этих различий; это просто работает.
Возможно, будут случаи, когда в некоторых пакетах используется код, который падает, когда передается data.frame, однако, учитывая, что data.table постоянно поддерживается, чтобы избежать таких проблем, любые проблемы, которые могут возникнуть, будут быстро исправлены.
Например,
Из новостей для v 1.8.2
- base :: unname (DT) теперь снова работает, как того требует plyr :: melt(). Благодаря Кристофа Джеккеля за репортаж. Тест добавлен.
- Для ITime был добавлен метод as.data.frame, так что ITime может быть передан ggplot2 без ошибок, № 1713. Спасибо Фаррелу Бучинскому за сообщение. Тесты добавлены. Метки оси ITime по-прежнему отображаются в виде целых секунд с полуночи; мы не знаем, почему ggplot2 не вызывает метод ITime as.character. Конвертировать ITime в POSIXct для ggplot2, это один из подходов.