.SD
выглядит полезным, но я действительно не знаю, что я делаю с этим. Что это значит? Почему существует предыдущий период (полная остановка). Что происходит, когда я использую это?
Я прочитал:
.SD
это data.table
содержащее подмножество x
данных «S для каждой группы, за исключением столбца (ов) группы. Он может быть использован при группировке по i
, при группировке по by
, ключом by
, и _AD hoc_by
Значит ли это, что дочь data.table
хранится в памяти для следующей операции?
r
data.table
Фаррел
источник
источник
?data.table
был улучшен в v1.7.10, благодаря этому вопросу. Это теперь объясняет имя.SD
согласно принятому ответу.Ответы:
.SD
расшифровывается как «S
ubset ofD
ata.table». Это не имеет никакого значения для первоначального"."
, за исключением того, что это делает еще более маловероятным, чтобы произошло столкновение с определенным пользователем именем столбца.Если это ваш data.table:
Это может помочь вам увидеть, что
.SD
:По сути,
by=y
оператор разбивает исходную таблицу data.table на эти дваdata.tables
и действует на них по очереди.
Хотя он работает с любым из них, он позволяет вам обращаться к текущему подпрограмме
data.table
, используя псевдоним / маркер / символ.SD
. Это очень удобно, так как вы можете обращаться к столбцам и работать с ними так же, как если бы вы сидели в командной строке и работали с единственной таблицей data.table, которая называется.SD
... за исключением того, что здесь выdata.table
будете выполнять эти операции в каждой под-data.table
определенной комбинации клавиш, «склеив» их обратно вместе и возвращая результаты в одномdata.table
!источник
.SD
этоDT[,print(.SD),by=y]
.DT[,print(.SD[,y]),by=y]
означает, что у меня есть доступ к значениюy
, даже если оно не является частью.SD
. Откуда ценность областиy
видимости? Это доступно, потому что это текущее значениеby
?.SD[,y]
обычноеdata.table
подмножество, так какy
столбец этого столбца.SD
не выглядит в среде, которая его вызвала, которая в данном случае являетсяj
средой (DT
запроса), вby
которой доступны переменные. Если его там нет, он выглядит в родительском, родительском и т. Д. Обычным способом. (Ну, через унаследованную область соединения тоже, которая не используется в этих примерах, потому что нетi
s).by=list(x,y,z)
будет означатьx
,y
иz
доступныj
. Для общего доступа они также включены.BY
. FAQ 2.10 имеет некоторую историю, но некоторую ясность можно добавить к?data.table
. Отлично, документальная помощь будет очень кстати. Еще лучше, если вы хотите присоединиться к проекту и изменить напрямую.Редактировать:
Учитывая, насколько хорошо был получен этот ответ, я преобразовал его в виньетку пакета, доступную здесь
Учитывая, как часто это происходит, я думаю, что это заслуживает немного большего изложения, помимо полезного ответа Джоша О'Брайена выше.
В дополнении к S ubset от D ату аббревиатуры обычно цитируемой / создатель Джош, я думаю , что это также полезно рассмотреть «S» стоять « тот же самый» или «Self-эталонным» -
.SD
находится в самом базовом обличию а рефлексивная ссылка наdata.table
саму себя - как мы увидим в примерах ниже, это особенно полезно для объединения «запросов» (извлечения / подмножества / и т. д.[
). В частности, это означает , что.SD
это само по себеdata.table
(с оговоркой, что оно не позволяет присваивать:=
).Более простое использование
.SD
для поднабора столбцов (т. Е. Когда.SDcols
указано); Я думаю, что эту версию гораздо проще понять, поэтому мы рассмотрим ее сначала ниже. Интерпретация при.SD
его втором использовании групповых сценариев (т. Е. Когдаby =
илиkeyby =
указано), концептуально немного отличается (хотя по сути это то же самое, поскольку, в конце концов, несгруппированная операция - это крайний случай группировки с одна группа).Вот несколько иллюстративных примеров и некоторые другие примеры использования, которые я сам часто использую:
Загрузка данных Lahman
Чтобы придать этому более реалистичный вид, а не составлять данные, давайте загрузим некоторые наборы данных о бейсболе из
Lahman
:обнаженный
.SD
Чтобы проиллюстрировать, что я имею в виду относительно рефлексивной природы
.SD
, рассмотрим ее наиболее банальное использование:То есть, мы только что вернулись
Pitching
, то есть это был слишком многословный способ написанияPitching
илиPitching[]
:С точки зрения подмножества,
.SD
это все еще подмножество данных, это просто тривиальное (сам набор).Подмножество столбцов:
.SDcols
Первый способ воздействия , что
.SD
это является ограничение столбцов , содержащихся в.SD
использовании.SDcols
аргумента[
:Это только для иллюстрации и было довольно скучно. Но даже это простое использование поддается широкому кругу очень полезных / вездесущих операций с данными:
Преобразование типов столбцов
Преобразование типа столбца является фактом существования для извлечения данных - на момент написания этой статьи
fwrite
невозможно автоматически читать столбцыDate
илиPOSIXct
столбцы , и преобразования между иcharacter
/factor
/numeric
встречаются часто. Мы можем использовать.SD
и.SDcols
для пакетного преобразования групп таких столбцов.Мы заметили, что следующие столбцы хранятся как
character
вTeams
наборе данных:Если вас смущает использование
sapply
здесь, обратите внимание, что это то же самое, что и для базы Rdata.frames
:Ключом к пониманию этого синтаксиса является напоминание о том, что a
data.table
(а также adata.frame
) можно рассматривать как a,list
где каждый элемент является столбцом - таким образом,sapply
/lapply
применяетсяFUN
к каждому столбцу и возвращает результат, какsapply
/lapply
обычно будет (здесьFUN == is.character
возвращаетсяlogical
длиной 1, такsapply
возвращает вектор).Синтаксис для преобразования этих столбцов
factor
очень похож - просто добавьте:=
оператор присваиванияОбратите внимание, что мы должны заключить
fkt
в скобки,()
чтобы заставить R интерпретировать это как имена столбцов, вместо того, чтобы пытаться присвоить имяfkt
RHS.Гибкость
.SDcols
(и:=
) принятьcharacter
вектор или вinteger
вектор позиций столбцов также может пригодиться для картины на основе преобразования имен столбцов *. Мы могли бы преобразовать всеfactor
столбцы вcharacter
:А затем преобразовать все столбцы, которые содержат
team
обратно вfactor
:** Явное использование номеров столбцов (например
DT[ , (1) := rnorm(.N)]
) является плохой практикой и может привести к незаметно искаженному коду с течением времени, если позиции столбцов изменятся. Даже неявное использование чисел может быть опасным, если мы не сохраняем умный / строгий контроль над порядком, когда мы создаем нумерованный индекс и когда мы его используем.Управление RHS модели
Различная спецификация модели является основной характеристикой надежного статистического анализа. Давайте попробуем спрогнозировать ERA (среднее значение заработанных ходов, показатель производительности) питчера, используя небольшой набор ковариат, представленных в
Pitching
таблице. Как (линейная) зависимость междуW
(выигрывает) иERA
изменяется в зависимости от того, какие другие ковариаты включены в спецификацию?Вот краткий сценарий, использующий возможности
.SD
этого вопроса:Коэффициент всегда имеет ожидаемый знак (у лучших кувшинов, как правило, больше побед и меньше разрешенных пробегов), но величина может существенно варьироваться в зависимости от того, что еще мы контролируем.
Условные объединения
data.table
синтаксис прекрасен своей простотой и надежностью. Синтаксисx[i]
гибко обрабатывает два общие подходы к Подменят - когдаi
этоlogical
вектор,x[i]
будет возвращать эти строки ,x
соответствующие гдеi
находитсяTRUE
; когдаi
является другимdata.table
,join
выполняется a (в простой форме, используяkey
s ofx
иi
, в противном случае, когдаon =
указано, используя совпадения этих столбцов).В целом это хорошо, но не получается, когда мы хотим выполнить условное объединение , в котором точный характер взаимосвязи между таблицами зависит от некоторых характеристик строк в одном или нескольких столбцах.
Этот пример немного придуман, но иллюстрирует идею; смотри здесь ( 1 , 2 ) для получения дополнительной информации.
Цель состоит в том, чтобы добавить
team_performance
вPitching
таблицу столбец, в котором записывается результативность команды (ранг) лучшего питчера в каждой команде (по наименьшему показателю ERA среди питчеров с минимум 6 зарегистрированными играми).Обратите внимание, что
x[y]
синтаксис возвращаетnrow(y)
значения, поэтому он.SD
находится справаTeams[.SD]
(поскольку RHS:=
в этом случае требуетnrow(Pitching[rank_in_team == 1])
значений.Сгруппированные
.SD
операцииЧасто мы хотели бы выполнить некоторые операции с нашими данными на уровне группы . Когда мы указываем
by =
(илиkeyby =
), ментальная модель того, что происходит, когдаdata.table
процессыj
должны думать о том, что выdata.table
разделены на множество компонентных подпрограммdata.table
, каждая из которых соответствует одному значению вашейby
переменной (переменных):В этом случае,
.SD
это несколько по своей природе - это относится к каждому из этих подпунктовdata.table
, по одному (чуть точнее, объем.SD
является одним подпунктомdata.table
). Это позволяет нам кратко выразить операцию, которую мы хотели бы выполнить на каждой подпрограмме,data.table
прежде чем нам будет возвращен пересобранный результат.Это полезно в различных настройках, наиболее распространенные из которых представлены здесь:
Подмножество групп
Давайте получим самый последний сезон данных для каждой команды в данных Lahman. Это можно сделать довольно просто:
Вспомните, что
.SD
оно само по себеdata.table
и.N
относится к общему количеству строк в группе (оно равноnrow(.SD)
каждой группе), поэтому.SD[.N]
возвращает полное значение.SD
для последней строки, связанной с каждойteamID
.Другой распространенной версией этого является использование
.SD[1L]
вместо этого, чтобы получить первое наблюдение для каждой группы.Группа Оптима
Предположим, что мы хотим вернуть лучший год для каждой команды, измеренный по их общему количеству забитых запусков (
R
разумеется, мы могли бы легко откорректировать это для ссылки на другие показатели). Вместо того, чтобы брать фиксированный элемент из каждого подпунктаdata.table
, мы теперь динамически определяем желаемый индекс следующим образом:Обратите внимание, что этот подход, конечно, можно комбинировать с
.SDcols
возвратом только частиdata.table
для каждого.SD
(с оговоркой, которая.SDcols
должна быть зафиксирована в различных подмножествах)NB :
.SD[1L]
в настоящее время оптимизируетсяGForce
( см. Также )data.table
внутренними компонентами, которые значительно ускоряют наиболее распространенные сгруппированные операции, такие какsum
илиmean
- см.?GForce
Дополнительную информацию и следите за / голосовой поддержкой запросов на улучшение функций для обновлений в этой области: 1 , 2 , 3 , 4 , 5 , 6Сгруппированная регрессия
Возвращаясь к приведенному выше запросу относительно отношений между
ERA
иW
, предположим, мы ожидаем, что эти отношения будут различаться в зависимости от команды (т. Е. Для каждой команды существует разный наклон). Мы можем легко перезапустить эту регрессию, чтобы исследовать неоднородность в этом отношении следующим образом (отмечая, что стандартные ошибки этого подхода, как правило, неверны - спецификацияERA ~ W*teamID
будет лучше - этот подход легче читать, а коэффициенты в порядке) :Хотя существует значительная степень неоднородности, существует четкая концентрация вокруг наблюдаемой общей стоимости
Надеюсь, это прояснило возможности создания
.SD
красивого и эффективного кодаdata.table
!источник
Я сделал видео об этом после разговора с Мэттом Доулом о .SD, вы можете посмотреть его на YouTube: https://www.youtube.com/watch?v=DwEzQuYfMsI
источник