【问题标题】:one hot encode each column in a Int matrix in R一个热编码R中Int矩阵中的每一列
【发布时间】:2020-06-01 10:45:34
【问题描述】:

我在将矩阵转换为 R 中的一种热编码时遇到了问题。我在 Matlab 中实现了但我在处理 R 中的对象时遇到了困难。这里我有一个“矩阵”类型的对象。

我想对这个矩阵应用一种热编码。我的列名有问题。

这是一个例子:

> 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))

非常感谢任何建议。

【问题讨论】:

  • 你好,斯维尔。请添加minimale reproducible example。另外,展示你已经尝试过的东西。这样你就可以帮助别人帮助你!
  • 嗨达里奥,谢谢你的建议。我添加了一个示例,我没有尝试太多,因为在线提供的示例具有列名,并且仅将一列转换为一种热编码。在我的情况下,这些列不存在,我想将每一列转换为一个热编码。我有一个基本的 R 对象(矩阵)处理问题,而不是一个热编码本身的概念。

标签: r one-hot-encoding


【解决方案1】:

您的数据表必须包含一些具有“因子”类的列(变量)。试试这个:

> 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

但我从here 中了解到,如果您的矩阵很大,则 caret 包中的dummyVars 函数会更快。

编辑:忘记设置种子。 :P

还有一种在数据表中分解所有变量的快速方法:

t.f <- t[, lapply(.SD, as.factor)]

【讨论】:

  • 我也读过那个页面。感谢你的快速回复。这种方法确实只翻译了第一列。并分解所有引发错误的变量,声明"Invalid Index type ''List"
  • 你确定?为我工作。只需复制并粘贴我的命令(删除&gt;)。如果你自己输入,可能会出现拼写错误,比如 .sd 而不是 .SD Let me know ...
  • 您可能忘记将矩阵转换为 data.table。 ;-)
  • 确实如此。我没有将矩阵转换为 data.table。我的错。感谢您指出它并且它有效。谢谢。问候
  • 虽然这两种解决方案都有效,但 Darios 解决方案很灵活,我接受了他的解决方案。我希望你没事。
【解决方案2】:

可能有更简洁的方法可以做到这一点,但这应该有效(并且至少易于阅读和理解;)

使用 base R 和双循环的建议解决方案:

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

【讨论】:

    猜你喜欢
    • 2020-11-27
    • 2016-12-03
    • 2020-03-31
    • 2019-01-27
    • 2021-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多