Я только начал использовать 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
, но не обязательна вDF
DT[[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
строк для каждогоNA
DT[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, это один из подходов.