我正在尝试使用混合(数字+因子)变量来伪代码数据帧。但是,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个变量,并且不可能进行子集化和执行。
是否有任何可能的解决方案使用dcast
或melt
或reshape
。
使用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))