R 在一个热编码中每行有多个值-建议这样做吗?

R 在一个热编码中每行有多个值-建议这样做吗?,r,r-caret,one-hot-encoding,R,R Caret,One Hot Encoding,我正在使用mltools中的one\u hot函数将一个2变量的数据帧转换为一个宽数据帧,其中每个变量(除了索引)都是一个因子级别 熔化的框架中有25000行,只有2个变量——一个是800级的因子,一个是索引,这样我可以在以后再合并回去 我将使用各种机器学习包,因此需要以一种可接受的方式表示800因子水平 然而,当我使用one\u hot时,我得到了一个包含801列的框架,这是正确的(800个因子级别+1个索引)但是我仍然有25000行。索引中以唯一值表示的原始观测数为1000 所以,我的问题是

我正在使用
mltools
中的
one\u hot
函数将一个2变量的数据帧转换为一个宽数据帧,其中每个变量(除了索引)都是一个因子级别

熔化的框架中有25000行,只有2个变量——一个是800级的因子,一个是索引,这样我可以在以后再合并回去

我将使用各种机器学习包,因此需要以一种可接受的方式表示800因子水平

然而,当我使用
one\u hot
时,我得到了一个包含801列的框架,这是正确的(800个因子级别+1个索引)但是我仍然有25000行。索引中以唯一值表示的原始观测数为1000

所以,我的问题是——一个热变量每行只有一个正值是最佳实践吗?现在将其向下折叠,使每一行都是一个观察值,是否有缺点


谢谢。

我将根据您提供的信息回答问题

基本上,你有25000个索引观察值(由
id
表示)的一个变量(800级的因子变量,由
val
表示)。你能做的是:

  • 按因子变量分组(例如,通过
    分组依据()
  • 添加频率计数(例如,通过
    freq=n()
  • 一个加热你的变量(mltools的
    mltools
    包真的很适合这样做)
  • 这将使您没有索引,但有一个2 x 801表,该表包含每个一个热变量(列1:800)及其频率(列801)。许多框架可以很好地处理这样的数据,但如果没有进一步的信息,就不可能具体回答

    > str(result)
    Classes ‘data.table’ and 'data.frame':  800 obs. of  801 variables:
     $ val_AAL5 : int  1 0 0 0 0 0 0 0 0 0 ...
     $ val_ABP14: int  0 1 0 0 0 0 0 0 0 0 ...
     $ val_ACQ8 : int  0 0 1 0 0 0 0 0 0 0 ...
     $ val_ADU8 : int  0 0 0 1 0 0 0 0 0 0 ...
     $ val_AEB16: int  0 0 0 0 1 0 0 0 0 0 ...
     $ val_AEX17: int  0 0 0 0 0 1 0 0 0 0 ...
     $ val_AGQ4 : int  0 0 0 0 0 0 1 0 0 0 ...
     $ val_AHS8 : int  0 0 0 0 0 0 0 1 0 0 ...
     $ val_AHV2 : int  0 0 0 0 0 0 0 0 1 0 ...
     $ val_AHX16: int  0 0 0 0 0 0 0 0 0 1 ...
     $ val_AIV19: int  0 0 0 0 0 0 0 0 0 0 ...
    ...
    
    密码
    df%
    分组依据(val)%>%
    总结(freq=n())
    
    你能提供一个小的可重复的例子吗?
    df <- df %>%
        group_by(val) %>%
        summarise(freq = n()) 
    dt <- as.data.table(df)
    result <- one_hot(dt)
    
    library(dplyr)
    library(data.table)
    library(mltools)
    set.seed(1701)
    df <- data.frame(
        id = 1:25000,
        val = sample(paste0(sample(LETTERS[1:26], 800, replace = TRUE),
                sample(LETTERS[1:26], 800, replace = TRUE),
                sample(LETTERS[1:26], 800, replace = TRUE),
                sample(1:20, 20, replace = TRUE)),
            25000, replace = TRUE))
    
    > head(df)
      id   val
    1  1 CXC15
    2  2 IPH16
    3  3  ICK1
    4  4  OPJ2
    5  5  XSA8
    6  6 JKS19