одно горячее кодирование каждого столбца в матрице Int в R - PullRequest
0 голосов
/ 17 февраля 2020

У меня проблема с переводом матрицы в одну горячую кодировку в R. Я реализовал в Matlab, но у меня есть трудности в обработке объекта в R. Здесь у меня есть объект типа 'matrix'.

Matrix having certain values

Я хотел бы применить одно горячее кодирование к этой матрице. У меня проблема с именами столбцов.

Вот пример:

> set.seed(4)
> t <- matrix(floor(runif(10, 1,9)),5,5)

      [,1] [,2] [,3] [,4] [,5]
[1,]    5    3    5    3    5
[2,]    1    6    1    6    1
[3,]    3    8    3    8    3
[4,]    3    8    3    8    3
[5,]    7    1    7    1    7
> class(t)
[1] "matrix"

Ожидается:

      1_1 1_3 1_5 1_7  2_1 2_3 2_6 2_8 ...
[1,]   0   0   1   0    0   1   0   0  ...
[2,]   1   0   0   0    0   0   1   0  ...
[3,]   0   1   0   0    0   0   0   1  ...
[4,]   0   1   0   0    0   0   0   1  ...   
[5,]   0   0   0   1    1   0   0   0  ...

Я попробовал следующее, но матрица остается прежней.

library(data.table)
library(mltools)
test_table <- one_hot(as.data.table(t))

Буду очень признателен за любые предложения.

Ответы [ 2 ]

3 голосов
/ 17 февраля 2020

Ваша таблица данных должна содержать несколько столбцов (переменных), которые имеют класс «фактор». Попробуйте это:

> t <- data.table(t)
> t[,V1:=factor(V1)]
> one_hot(t)
   V1_1 V1_3 V1_5 V1_7 V2 V3 V4 V5
1:    0    0    1    0  3  5  3  5
2:    1    0    0    0  6  1  6  1
3:    0    1    0    0  8  3  8  3
4:    0    1    0    0  8  3  8  3
5:    0    0    0    1  1  7  1  7

Но я читал, что из здесь функция dummyVars из пакета caret работает быстрее, если ваша матрица велика.

Редактировать : Забыл установить семена. : P

И быстрый способ учета всех переменных в таблице данных:

t.f <- t[, lapply(.SD, as.factor)]
1 голос
/ 17 февраля 2020

Возможно, есть более лаконичные способы сделать это, но это должно сработать (и, по крайней мере, легко читается и понимается;)

Предлагаемое решение с использованием base R и двойного l oop:

set.seed(4)  
t <- matrix(floor(runif(10, 1,9)),5,5)

# initialize result object
#
t_hot <- NULL

# for each column in original matrix
#
for (col in seq_along(t[1,])) {
  # for each unique value in this column (sorted so the resulting
  # columns appear in order)
  #
  for (val in sort(unique(t[, col]))) {
    t_hot <- cbind(t_hot, ifelse(t[, col] == val, 1, 0))
    # make name for this column
    #
    colnames(t_hot)[ncol(t_hot)] <- paste0(col, "_", val)
  }
}

Возвращает:

     1_1 1_3 1_5 1_7 2_1 2_3 2_6 2_8 3_1 3_3 3_5 3_7 4_1 4_3 4_6 4_8 5_1 5_3 5_5 5_7
[1,]   0   0   1   0   0   1   0   0   0   0   1   0   0   1   0   0   0   0   1   0
[2,]   1   0   0   0   0   0   1   0   1   0   0   0   0   0   1   0   1   0   0   0
[3,]   0   1   0   0   0   0   0   1   0   1   0   0   0   0   0   1   0   1   0   0
[4,]   0   1   0   0   0   0   0   1   0   1   0   0   0   0   0   1   0   1   0   0
[5,]   0   0   0   1   1   0   0   0   0   0   0   1   1   0   0   0   0   0   0   1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...