R: выбор подмножества без копирования


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

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

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

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

1 ответ:

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

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

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

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

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