如何在R中使用大数据对多个变量进行热编码?

如何在R中使用大数据对多个变量进行热编码?,r,categorical-data,one-hot-encoding,bigdata,R,Categorical Data,One Hot Encoding,Bigdata,我目前有一个数据框架,有260000行和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 不知道你说的热编码是什么意思 下面是一个使用dplyr将分类变量iris$SECTIONS展开为三列的示例: df <- iris %>%

我目前有一个数据框架,有260000行和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

不知道你说的热编码是什么意思

下面是一个使用dplyr将分类变量iris$SECTIONS展开为三列的示例:

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
您可以使用model.matrix或sparse.model.matrix。大概是这样的:

稀疏。模型。矩阵~-1,数据=您的_数据

这个~。告诉R你的整个桌子都是空的。是某个假设模型的右侧,-1表示省略截距。如果没有-1,您的第一列将是1的向量。

基本上是一个带有data.table和mltools的单行程序:

数据
我如何将其转换回数据帧以查看其内容?我知道它不能被dgCMatrix强制。是的,如果你能说as.data.frame就好了,但你必须先去matrix。试试as.data.frameas.matrixsparse.model.matrix~-1,data=您的数据。除非您选择model.matrix,否则在这种情况下,它与.data.framemodel.matrix一样,ex_dat%>%selectstarts_with cat。在这种情况下,我如何排除第一列?第一列是什么意思?如果这有帮助,下面是另一篇SO帖子,它更好地解释了-1的用法,如果你添加fill=0来传播,那么会有0而不是NAs,这将是OP所要求的,但不清楚这将如何处理多个分类变量。
# 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)