代码之家  ›  专栏  ›  技术社区  ›  DeduciveR

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

  •  -1
  • DeduciveR  · 技术社区  · 7 年前

    我用的是 one_hot mltools 将一个2变量的熔融数据帧转换成一个宽数据帧,其中每个变量(除了索引)是一个因子级别。

    熔融框架中有25000行,只有两个变量——一个是800级别的a因子,一个是索引,这样我可以在以后的某个点上合并回来。

    但是,当我使用 我得到了一个801列的框架,这是正确的(800个因子级别+1个索引) 但是

    所以,我的问题是-一个热点变量每行只有一个正值是最佳实践吗?现在把它折叠成每一行是一个观测值有什么缺点吗?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Roman    6 年前

    我将根据你提供的信息回答这个问题。

    25000个索引观测 (代表 id 一个变量 (具有800个级别的因子变量,表示为 val 能行 是:

    1. 按因子变量分组(例如,通过 group_by() )
    2. 添加频率计数(例如,通过 freq = n() )
    3. 一个热你的变量 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 <- 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