【问题标题】:Convert a factor column to multiple boolean columns将一个因子列转换为多个布尔列
【发布时间】:2012-07-05 18:41:38
【问题描述】:

给定的数据看起来像:

library(data.table)
DT <- data.table(x=rep(1:5, 2))

我想将此数据拆分为 5 个布尔列,以指示每个数字的存在。

我可以这样做:

new.names <- sort(unique(DT$x))

DT[, paste0('col', new.names) := lapply(new.names, function(i) DT$x==i), with=FALSE]

但这使用了一个讨厌的lapply,它可能比 data.table 替代方案慢,而且这个解决方案让我觉得不是很“data.table-ish”。

是否有更好和/或更快的方法来创建这些新列?

【问题讨论】:

  • model.matrix 之类的内容会有所帮助吗? model.matrix(~cols-1)

标签: r data.table


【解决方案1】:

model.matrix怎么样?

model.matrix(~factor(x)-1,data=DT)

   factor(x)1 factor(x)2 factor(x)3 factor(x)4 factor(x)5
1           1          0          0          0          0
2           0          1          0          0          0
3           0          0          1          0          0
4           0          0          0          1          0
5           0          0          0          0          1
6           1          0          0          0          0
7           0          1          0          0          0
8           0          0          1          0          0
9           0          0          0          1          0
10          0          0          0          0          1
attr(,"assign")
[1] 1 1 1 1 1
attr(,"contrasts")
attr(,"contrasts")$`factor(x)`
[1] "contr.treatment"

显然,您可以将model.matrix 放入[.data.table 以得到相同的结果。不确定它是否会更快:

DT[,model.matrix(~factor(x)-1)]

【讨论】:

    【解决方案2】:

    还有nnet::class.ind

    library(nnet)
    
    cbind(DT, setnames(as.data.table(DT[, class.ind(x)]),paste0('col', unique(DT$x))))
    

    【讨论】:

      【解决方案3】:
      library(data.table)
      DT <- data.table(x=rep(1:5, 2))
      
      # add column with id
      DT[, id := seq.int(nrow(DT))]
      
      # cast long table into wide
      DT.wide <- dcast(DT, id ~ x, value.var = "x", fill = 0, fun = function(x) 1)
      

      【讨论】:

        猜你喜欢
        • 2023-03-07
        • 1970-01-01
        • 2016-01-15
        • 1970-01-01
        • 2013-09-02
        • 2015-01-22
        • 2021-01-03
        • 1970-01-01
        • 2014-11-08
        相关资源
        最近更新 更多