Имена строк для data.table в R для model.matrix

У меня есть data.table DT, и я хочу запустить на нем model.matrix. Каждая строка имеет строковый идентификатор, который хранится в столбце ID таблицы DT. Когда я запускаю model.matrix для DT, моя формула исключает столбец ID. Проблема в том, что model.matrix отбрасывает некоторые строки из-за NA. Если я установлю имена строк DT в столбец ID перед вызовом model.matrix, то окончательная матрица модели будет иметь имена строк, и все готово. В противном случае я не могу понять, какие строки я получаю. Я устанавливаю имена строк с помощью rownames(DT) = DT$ID. Однако, когда я пытаюсь добавить новый столбец в DT, я получаю жалобу на

«Обнаружена недействительная .internal.selfref... Ранее эта таблица данных была скопирована R».

Так что мне интересно

  1. Есть ли лучший способ установить имена строк для data.table
  2. Есть ли лучший подход к решению этой проблемы.

person DavidR    schedule 20.12.2012    source источник


Ответы (1)


Здесь есть несколько проблем.

Во-первых, особенностью data.table является то, что у них нет rownames, вместо этого у них есть key, которые намного мощнее. См. эту замечательную виньетку.

Но это не конец света. model.matrix возвращает разумные имена строк, когда вы передаете ему data.table

Например

A <- data.table(ID = 1:5, x = c(NA, 1:4), y = c(4:2,NA,3))

mm <- model.matrix( ~ x + y, A)

rownames(mm)

## [1] "2" "3" "5"

Таким образом, строки 2,3 и 5 включены в model.matrix.

Теперь вы можете добавить эту последовательность в виде столбца в A. Это будет полезно, если вы затем установите ключ на что-то другое (тем самым потеряв первоначальный порядок)

A[, rowid := seq_len(nrow(A)]

Вы можете подумать о том, чтобы сделать его символьным (например, имена строк mm)), но это не будет иметь большого значения (поскольку вы можете так же легко преобразовать rownames(mm) в числовое, когда вам нужно сослаться.

Что касается предупреждения, которое дает data.table, если вы прочитаете следующее предложение

Избегайте ключей‹-, имен‹- и атрибутов‹-, которые в настоящее время в R (как ни странно) могут копировать всю таблицу данных. Вместо этого используйте синтаксис set*, чтобы избежать копирования: setkey(), setnames() и setattr().

rownames являются атрибутом rownames<- (внутренне в какой-то момент с использованием эквивалента attr<-) будут (возможно, скопированы) таким же образом.

Строка от `row.names<-.data.frame`

attr(x, "row.names") <- value

При этом data.tables не имеет имен строк, поэтому нет смысла их устанавливать.

person mnel    schedule 20.12.2012
comment
Большое спасибо - извините за мое очень запоздалое продолжение. Итак, если я правильно понимаю, ключевым фактом является то, что model.matrix помещает исходные номера строк в качестве имен строк, и это почти все, что мне нужно. - person DavidR; 16.01.2013