gpt4 book ai didi

R : convert discrete column into matrix of logical values

转载 作者:行者123 更新时间:2023-11-30 08:30:33 25 4
gpt4 key购买 nike

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

我在数据框中有一个因子列,我想将该列转换为逻辑值的列矩阵(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_output
colSums(expected_output)

对于产生预期输出的“快速”函数有什么建议吗?这是一个大数据问题(700 个离散可能性,1M 个观察值)。

最佳答案

这里有 2 种解决方案,一种使用基本 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 0

colSums(mat)
#[1] 3 1 2 1 1 0

方法#2:稀疏矩阵

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 个元素)的一些基准测试,您可以在其中真正看到使用稀疏矩阵的好处:

# Sample data
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)

# Benchmarks
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 cld
Robert 444.625026 486.130804 461.653480 548.755603 632.1418 100 d
Frank1 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

关于R : convert discrete column into matrix of logical values,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31139307/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com