r - 在R的稀疏矩阵中直接创建伪变量集

标签 r matrix sparse-matrix r-factor

假设您的数据框具有大量列(1000个因子,每个因子有15个级别)。您想创建一个虚拟变量数据集,但是由于它太稀疏了,因此您希望使假人保持稀疏矩阵格式。

我的数据集很大,步骤越少,对我来说越好。我知道如何执行上述步骤;但我无法直接从初始数据集中创建稀疏矩阵,即只用一个步骤而不是两个步骤。有任何想法吗?

编辑:一些评论要求进一步的阐述,所以它去了:

其中X是我的原始数据集,具有1000列和50000条记录,每列有15个级别,

步骤1:使用类似的代码从原始数据集中创建伪变量;

# Creating dummy data set with empty values
dummified <- matrix(NA,nrow(X),15*ncol(X))
# Adding values to this data set for each column and each level within columns
for (i in 1:ncol(X)){colFactr <- factor(X[,i],exclude=NULL)
  for (j in 1:l){
    lvl <- levels(colFactr)[j]
    indx <- ((i-1)*l)+j
    dummified[,indx] <- ifelse(colFactr==lvl,1,0)
  }
}

步骤2:使用类似的代码将巨大的矩阵转换为稀疏矩阵;
sparse.dummified <- sparseMatrix(dummified)

但是这种方法仍然创建了这个临时的大矩阵,这需要大量的时间和内存,因此我要问直接的方法论(如果有的话)。

最佳答案

感谢您澄清了您的问题,请尝试此操作。

这是带有两列的样本数据,这两列分别具有三个和两个级别:

set.seed(123)
n <- 6
df <- data.frame(x = sample(c("A", "B", "C"), n, TRUE),
                 y = sample(c("D", "E"),      n, TRUE))
#   x y
# 1 A E
# 2 C E
# 3 B E
# 4 C D
# 5 C E
# 6 A D

library(Matrix)
spm <- lapply(df, function(j)sparseMatrix(i = seq_along(j),
                                          j = as.integer(j), x = 1))
do.call(cBind, spm)
# 6 x 5 sparse Matrix of class "dgCMatrix"
#               
# [1,] 1 . . . 1
# [2,] . . 1 . 1
# [3,] . 1 . . 1
# [4,] . . 1 1 .
# [5,] . . 1 . 1
# [6,] 1 . . 1 .

编辑:@ user20650指出do.call(cBind, ...)缓慢或出现大数据失败。因此,这是一种更复杂但又更快又有效的方法:
n <- nrow(df)
nlevels <- sapply(df, nlevels)
i <- rep(seq_len(n), ncol(df))
j <- unlist(lapply(df, as.integer)) +
     rep(cumsum(c(0, head(nlevels, -1))), each = n)
x <- 1
sparseMatrix(i = i, j = j, x = x)

关于r - 在R的稀疏矩阵中直接创建伪变量集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23035982/

相关文章:

c - 如何从文件中读取矩阵?

python - 如何从特定格式的 DataFrame 创建稀疏矩阵

python - 从另一个 csr_matrix 的一行创建 csr_matrix 的平铺操作

R Shiny : Conditional panel based on row selected in datatable

java - 用Java将两个矩阵相乘

r - ggplotGrob如何工作?

java - 如何在 JTextArea 中均匀地分隔二维数组而不使用\t?

在 C 中使用链表创建稀疏矩阵

r - R可以将纬度和经度点合并到空间多边形中的区域吗?

r - 向大型 (16Mill) 列表的所有元素添加一些字符串(可能是关于应用语法的问题)