R: выбор подмножества без копирования - PullRequest
10 голосов
/ 05 марта 2012

Есть ли способ выбрать подмножество из объектов (фреймы данных, матрицы, векторы) без копирования выбранных данных?

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

Некоторые возможные подходы, которые могут соответствовать моим потребностям и, надеюсь, реализованы в некоторых R-пакетах:

  • механизм копирования-при-записи , т.е. структуры данных, которыекопируется только когда вы добавляете или перезаписываете существующие элементы;
  • неизменяемые структуры данных , которые требуют воссоздания только индексной информации для структуры данных, но не ее содержимого (например, создание подстроки из строки толькосоздание небольшого объекта, который содержит длину и указатель на тот же массив символов);
  • xapply() аналогов, которые не создают подмножеств.

1 Ответ

7 голосов
/ 06 марта 2012

Попробуйте пакет ref . В частности, его refdata класс.

Что вам может не хватать в data.table, так это то, что при группировке (параметр by=) подмножества данных не копируются, так что это быстро. [Технически, они находятся в общей области памяти, которая повторно используется для каждой группы и копируется с использованием memcpy, который намного быстрее, чем R для циклов в C.]

:= в data.table - это один из способов изменить data.table на месте. data.table отличается от обычного стиля программирования R в том смысле, что он не скопирован при записи. Пользователь должен явно вызвать copy(), чтобы скопировать (потенциально очень большую) таблицу, даже внутри функции.

Вы правы, что в data.table не встроен механизм, подобный refdata. Я понимаю, что вы имеете в виду, и это было бы неплохо. refdata должен работать на data.table, и вы можете работать с data.frame (но обязательно следите за копиями с tracemem(DF)).

Существует также idata.frame (неизменный data.frame) в пакете plyr, который вы можете попробовать.

...