Фиктивный код / Одно горячее кодирование переменных с менее чем 2 уровнями в R

#r #dataframe #dplyr #data.table #purrr

#r #фрейм данных #dplyr #данные.таблица #мурлыканье

Вопрос:

Я пытаюсь создать фрейм данных фиктивного кода со смешанными (числовыми множительными) переменными. Но model.matrix не будет применим для переменных, имеющих уровни более 2.

Пример данных-

 dt <- data.frame(A=c("1","1","1"),
                 B=c("0","1","1"),
                 C=c("5","6","7"),
                 id=c(1,2,3))
  

Желаемый результат-

   A1 B0 B1 B2 C5 C6 C7 id
1  1  1  0  0  1  0  0  1
2  1  0  1  0  0  1  0  2
3  1  0  0  1  0  0  1  3
  

Мои попытки-

 dt_res <- model.matrix(~. 0,dt)
  

Это прекрасно работает без постоянных переменных. Но у меня более 1000 переменных, и невозможно подмножество и сделать это.

Есть ли какое-либо возможное решение, использующее dcast или melt или reshape .

Комментарии:

1. mltools::one_hot

2. поддерживает ли он факторную переменную с менее чем 2 уровнями?

Ответ №1:

Используя data.table , вы можете сначала расплавить его, прежде чем переводить в желаемый широкий формат:

 library(data.table)
setDT(dt)
cols <- names(dt[, -"id"])
dcast(
    melt(dt[, c(.(id=id), lapply(cols, function(x) paste0(x, get(x))))], id.vars="id"), 
    id ~ value,
    length)
  

вывод:

    id A1 B0 B1 B2 C5 C6 C7
1:  1  1  1  0  0  1  0  0
2:  2  1  0  1  0  0  1  0
3:  3  1  0  0  1  0  0  1
  

данные:

 dt <- data.frame(A=c("1","1","1"),
    B=c("0","1","2"),
    C=c("5","6","7"),
    id=c(1,2,3))