虚拟代码/ R中少于2个级别的变量的一个热编码

问题描述 投票:0回答:1

我正在尝试使用混合(数字+因子)变量来伪代码数据帧。但是,model.matrix不适用于级别超过2的变量。

样本数据-

dt <- data.frame(A=c("1","1","1"),
                 B=c("0","1","1"),
                 C=c("5","6","7"),
                 id=c(1,2,3))

期望的输出 -

  A1 B0 B1 B2 C5 C6 C7 id
1  1  1  0  0  1  0  0  1
2  1  0  1  0  0  1  0  2
3  1  0  0  1  0  0  1  3

我的尝试 -

dt_res <- model.matrix(~.+0,dt)

没有常量变量,这完全正常。但是,我有超过1000个变量,并且不可能进行子集化和执行。

是否有任何可能的解决方案使用dcastmeltreshape

r dataframe dplyr data.table purrr
1个回答
2
投票

使用data.table,您可以先将其熔化,然后再将其转换为所需的宽幅:

library(data.table)
setDT(dt)
cols <- names(dt[, -"id"])
dcast(
    melt(dt[, c(.(id=id), lapply(cols, function(x) paste0(x, get(x))))], id.vars="id"), 
    id ~ value,
    length)

输出:

   id A1 B0 B1 B2 C5 C6 C7
1:  1  1  1  0  0  1  0  0
2:  2  1  0  1  0  0  1  0
3:  3  1  0  0  1  0  0  1

数据:

dt <- data.frame(A=c("1","1","1"),
    B=c("0","1","2"),
    C=c("5","6","7"),
    id=c(1,2,3))
© www.soinside.com 2019 - 2024. All rights reserved.