У меня есть фрейм данных R, содержащий фактор, который я хочу «расширить», чтобы для каждого уровня фактора существовал связанный столбец в новом фрейме данных, который содержит индикатор 1/0. Например, предположим, у меня есть:
df.original <-data.frame(eggs = c("foo", "foo", "bar", "bar"), ham = c(1,2,3,4))
Я хочу:
df.desired <- data.frame(foo = c(1,1,0,0), bar=c(0,0,1,1), ham=c(1,2,3,4))
Поскольку для определенных анализов, для которых вам нужен полностью числовой фрейм данных (например, анализ основных компонентов), я подумал, что эта функция может быть встроена. Написание функции для этого не должно быть слишком сложно, но я могу предвидеть некоторые проблемы, связанные с именами столбцов, и если что-то уже существует, я бы предпочел это использовать.
cast
.?formula
, а также?model.matrix
, но было неясно , (может быть просто мое отсутствие глубины знаний в матричной алгебре и формулировке модели). Покопав больше, я смог понять, что -1 просто указывает не включать столбец «перехват». Если вы не укажете -1, вы увидите в выходных данных столбец перехвата, состоящий из единиц, с одним оставленным двоичным столбцом. Вы можете увидеть, какие значения в пропущенном столбце равны 1, на основе строк, в которых значения других столбцов равны 0. Документация кажется загадочной - есть ли еще один хороший ресурс?model.matrix(~., data=iris)[,-1]
naresid
чтобы вернуть недостающие значения после использованияna.exclude
. Краткий пример:tmp <- data.frame(x=factor(c('a','b','c',NA,'a'))); tmp2 <- na.exclude(tmp); tmp3 <- model.matrix( ~x-1, tmp2); tmp4 <- naresid(attr(tmp2,'na.action'), tmp3)
Если ваш фрейм данных состоит только из факторов (или вы работаете с подмножеством переменных, которые все являются факторами), вы также можете использовать
acm.disjonctif
функцию изade4
пакета:Не совсем тот случай, который вы описываете, но он тоже может быть полезен ...
источник
Быстрый способ использования
reshape2
пакета:Обратите внимание, что это дает именно те имена столбцов, которые вам нужны.
источник
ham
что это уникальный идентификатор строки. Еслиham
это не уникальный идентификатор, нужно использовать какой-то другой уникальный идентификатор (или создать фиктивный) и использовать его вместоham
. Преобразование категориальной метки в бинарный индикатор имеет смысл только для уникальных идентификаторов.вероятно, фиктивная переменная похожа на то, что вы хотите. Тогда пригодится model.matrix:
источник
Поздний вход
class.ind
изnnet
пакетаисточник
Просто наткнулся на этот старый поток и подумал, что добавлю функцию, которая использует ade4, чтобы взять фрейм данных, состоящий из факторов и / или числовых данных, и вернуть фрейм данных с факторами в качестве фиктивных кодов.
Давай попробуем.
источник
Вот более понятный способ сделать это. Я использую model.matrix для создания фиктивных логических переменных, а затем объединяю их обратно в исходный фрейм данных.
источник
Мне нужна была функция для "разнесения" факторов, которая была бы немного более гибкой, и я сделал ее на основе функции acm.disjonctif из пакета ade4. Это позволяет вам выбрать разнесенные значения, которые равны 0 и 1 в acm.disjonctif. Он взрывает только те факторы, которые имеют «несколько» уровней. Числовые столбцы сохраняются.
источник