R : 将离散列转换为逻辑值矩阵

我想将一个离散(标识符)变量转换为一系列逻辑列,以便我可以在逻辑回归函数(和其他函数)中使用该变量作为特征,而这些函数不能混合使用连续和离散值。

我有一个数据框中的因子列,我想将该列转换为一个由逻辑值组成的矩阵列(1到“级别数量”),例如:

my_labels=c("a","b","c","d","e","f")my_tally=c(1,1,3,2,3,4,5,1)my_tally=factor(my_tally, levels=c(1:6), labels=my_labels)summary(my_tally)expected_output=c(1,0,0,0,0,0,     #1                  1,0,0,0,0,0,     #1                  0,0,1,0,0,0,     #3                  0,1,0,0,0,0,     #2                  0,0,1,0,0,0,     #3                  0,0,0,1,0,0,     #4                  0,0,0,0,1,0,     #5                  1,0,0,0,0,0      #1                  )expected_output=matrix(expected_output,                        nrow=length(my_tally),                        ncol=length(levels(my_tally)),                       byrow=TRUE                       )expected_outputcolSums(expected_output)

对于生成expected_output的“快速”函数,有什么建议吗?这是一个大型数据问题(700个离散可能性,100万个观测值)。


回答:

这里有两个解决方案,一个使用基础R,适用于较小数据集时速度更快,另一个使用Matrix包中的稀疏矩阵,适用于较大数据集时速度非常快。

创建一个只填充0的矩阵

mat <- matrix(0, nrow=length(my_tally), ncol=length(levels(my_tally)))

使用索引在适当的位置分配1:

mat[cbind(1:length(my_tally), as.numeric(my_tally))] <- 1#     [,1] [,2] [,3] [,4] [,5] [,6]#[1,]    1    0    0    0    0    0#[2,]    1    0    0    0    0    0#[3,]    0    0    1    0    0    0#[4,]    0    1    0    0    0    0#[5,]    0    0    1    0    0    0#[6,]    0    0    0    1    0    0#[7,]    0    0    0    0    1    0#[8,]    1    0    0    0    0    0colSums(mat)#[1] 3 1 2 1 1 0

方法二:稀疏矩阵

library(Matrix)colSums(sparseMatrix(i=1:length(my_tally), j=as.numeric(my_tally),    dims=c(length(my_tally), length(levels(my_tally)))))#[1] 3 1 2 1 1 0

这里是在一个更大的样本数据集(260个级别,100,000个元素)上的基准测试,你可以真正看到使用稀疏矩阵的好处:

# 样本数据my_labels <- c(LETTERS, letters, paste0(LETTERS, letters), paste0(letters, LETTERS),            paste0(letters, letters, letters), paste0(LETTERS, LETTERS, LETTERS),            paste0(LETTERS, letters, LETTERS), paste0(letters, LETTERS, letters),            paste0(LETTERS, letters, letters), paste0(letters, LETTERS, LETTERS))my_tally <- sample(1:260, 100000, replace=TRUE)my_tally <- factor(my_tally, levels=c(1:260), labels=my_labels)# 基准测试library(microbenchmark)microbenchmark(  Robert <- colSums(table(1:length(my_tally),my_tally)),  Frank1 <- {mat <- matrix(0, nrow=length(my_tally), ncol=length(levels(my_tally)))      mat[cbind(1:length(my_tally), as.numeric(my_tally))] <- 1      colSums(mat)},  Frank2 <- colSums(sparseMatrix(i=1:length(my_tally), j=as.numeric(my_tally),      dims=c(length(my_tally), length(levels(my_tally))))),  Khashaa <- colSums(diag(length(my_labels))[my_tally, ])  )                lq       mean     median         uq      max neval  cldRobert  444.625026 486.130804 461.653480 548.755603 632.1418   100    dFrank1  328.947431 358.538855 337.136012 360.727606 458.2305   100   c Frank2    4.241506   8.997434   4.354615   4.519896 135.3001   100 a   Khashaa 224.675094 256.337639 237.905714 260.163725 375.5642   100  b

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注