【问题标题】:How can I one hot encode multiple variables with big data in R?如何在 R 中使用大数据对多个变量进行热编码?
【发布时间】:2018-04-08 08:28:31
【问题描述】:

我目前有一个包含 260,000 行和 50 列的数据框,其中 3 列是数字,其余的是分类。我想对分类列进行一次热编码,以执行 PCA 并使用回归来预测类别。如何在 R 中完成以下示例?

Example:
V1 V2 V3 V4 V5 .... VN-1 VN

to

V1_a V1_b V2_a V2_b V2_c V3_a V3_b and so on

【问题讨论】:

    标签: r categorical-data one-hot-encoding bigdata


    【解决方案1】:

    您可以使用model.matrixsparse.model.matrix。像这样的:

    sparse.model.matrix(~. -1, data = your_data)

    ~. 告诉 R 你的整个表(.)是某个假设模型的右侧,-1 说要省略截距。如果没有-1,您的第一列将是一个 1 的向量。

    【讨论】:

    • 如何将其转回数据框以查看其内容?我知道它不能被 dgCMatrix 强制。
    • 是的,如果你能说as.data.frame() 就好了,但你必须先去矩阵。试试as.data.frame(as.matrix(sparse.model.matrix(~. -1, data = your_data)))
    • 除非你选择了model.matrix,在这种情况下它只是as.data.frame(model.matrix(~., ex_dat %>% select(starts_with("cat"))))
    • 在这种情况下如何排除第一列?
    • “第一列”是什么意思?如果这有帮助,这里是另一个 SO 帖子,可以更好地解释 -1 stats.stackexchange.com/questions/174976/… 的使用
    【解决方案2】:

    不要真正理解“热编码”的意思。

    这是一个使用 dplyr 将分类变量 iris$Species 展开为三个单独列的示例:

    df <- iris %>% 
            mutate(id = rownames(.) %>%  # unique identified to prevent duplicate rows when spreading
            mutate(val=1) %>% # give the categorical variable a value of 1
           spread(Species, val) # spread out each level of iris$Species as columns
    
     df[76:80,]
    
       Sepal.Length Sepal.Width Petal.Length Petal.Width  id setosa versicolor virginica
    76          5.8         2.7          4.1         1.0  68     NA          1        NA
    77          5.8         2.7          5.1         1.9 102     NA         NA         1
    78          5.8         2.7          5.1         1.9 143     NA         NA         1
    79          5.8         2.8          5.1         2.4 115     NA         NA         1
    80          5.8         4.0          1.2         0.2  15      1         NA        NA
    

    【讨论】:

    • 如果您确实将fill = 0 添加到spread,以便有0而不是NA,这将是OP所要求的,但尚不清楚这将如何处理多个分类变量。
    【解决方案3】:

    基本上是带有data.tablemltools 的oneliner:

    # data.table with 125 variables:
    dt_1h <- one_hot(dt)
    
    # MD5 for checking reproducibility:
    > digest::digest(dt_1h, algo = "md5")
    [1] "f1eb1c1e2d5d94b709101557c9ed8d0d"
    

    数据

    library(data.table)
    library(mltools)
    set.seed(1701)
    df <- data.frame(matrix(sample(c(LETTERS[1:26]),
                                   260000*3, replace = TRUE), ncol = 3),
                     matrix(rnorm(260000*47), ncol = 47))
    dt <- as.data.table(df)    
    

    【讨论】:

      猜你喜欢
      • 2018-07-16
      • 2016-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-28
      • 2023-04-11
      相关资源
      最近更新 更多