【问题标题】:Create binary variables from categorical with sparse matrix从具有稀疏矩阵的分类创建二进制变量
【发布时间】:2016-04-04 11:59:59
【问题描述】:

我有这个data.table:

df <- data.table(u = c(1,2,3,4,5), d = c(1,2,0,1,2), V1 = c(0.3, 0.2, 0.2, 0.1, 0.2), 
                     pred = c(1,2,0,1,0), sec_pred = c(2,1,0,1,0), ones = rep(1,5))

#   u d  V1 pred sec_pred ones
#1: 1 1 0.3    1        2    1
#2: 2 2 0.2    2        1    1
#3: 3 0 0.2    0        0    1
#4: 4 1 0.1    1        1    1
#5: 5 2 0.2    0        0    1

我想得到这样的矩阵:

dcast(df, u + d + V1 ~ pred + sec_pred, fill = 0, value.var = 'ones')

#   d  V1 u 0_0 1_1 1_2 2_1
#1: 0 0.2 3   1   0   0   0
#2: 1 0.1 4   0   1   0   0
#3: 1 0.3 1   0   0   1   0
#4: 2 0.2 2   0   0   0   1
#5: 2 0.2 5   1   0   0   0

但由于我有一个非常大的 data.table,我想创建一个稀疏矩阵。但是最好创建 predsec_pred 值的所有可能组合,例如 0_0、0_1、0_2、1_0、1_1...

【问题讨论】:

    标签: r data.table sparse-matrix


    【解决方案1】:

    一个选项可能是

    library(Matrix)
    v1 <- df[, do.call(paste, c(.SD, list( sep="_"))), .SDcols = 4:5]
    j1 <- match(v1, unique(v1))
    sM <- sparseMatrix(1:nrow(df), j1, x=1, 
                         dimnames = list(NULL, unique(v1)))
    sM
    #   5 x 4 sparse Matrix of class "dgCMatrix"
    #     1_2 2_1 0_0 1_1
    #[1,]   1   .   .   .
    #[2,]   .   1   .   .
    #[3,]   .   .   1   .
    #[4,]   .   .   .   1
    #[5,]   .   .   1   .
    

    如果需要order

    sM[,order(colnames(sM))]
    #5 x 4 sparse Matrix of class "dgCMatrix"
    #     0_0 1_1 1_2 2_1
    #[1,]   .   .   1   .
    #[2,]   .   .   .   1
    #[3,]   1   .   .   . 
    #[4,]   .   1   .   .
    #[5,]   1   .   .   .
    

    【讨论】:

    • 谢谢!如果我想要所有可能的组合,我应该如何更改您的代码?
    • @VitaliyRadchenko 在这种情况下,对数据集的唯一值使用 combn。对于您提供的示例,不清楚。
    • @VitaliyRadchenko 也许df2 &lt;- expand.grid(rep(list(unique(c(df$pred, df$sec_pred))),2)) , paste 将列放在一起并检查原始数据集中的粘贴元素。
    猜你喜欢
    • 1970-01-01
    • 2012-01-10
    • 1970-01-01
    • 2017-03-31
    • 2016-07-12
    • 2022-11-02
    • 1970-01-01
    • 1970-01-01
    • 2021-12-05
    相关资源
    最近更新 更多