将R中的S4 DataFrame对象转换为稀疏矩阵

3

在R语言中,我有一个由Rle编码元素组成的S4 DataFrame。 以下代码可以模拟数据

x = DataFrame(Rle(1:10),Rle(11:20),Rle(21:30))

现在,我想将这个数据帧从Matrix软件包转换为稀疏矩阵。对于常规的data.frame,可以执行以下操作:
Matrix(x,sparse=TRUE)

然而,这对于数据框架并不适用,因为会产生以下错误:

Matrix(x,sparse=TRUE)

Error in as.vector(data) : 没有将这个S4类强制转换为向量的方法

您有什么好的想法可以以比较高效的方式在不同的数据类型之间进行转换吗?

谢谢!


Matrix(as.data.frame(x));DataFrame和Rle来自Bioconductor S4Vectors包,因此最好在Bioconductor支持网站上提出有关它们的问题。 - Martin Morgan
@MartinMorgan 谢谢您的回复,但这个方法不起作用。它返回错误Error in asMethod(object) : invalid class 'NA' to dup_mMatrix_as_geMatrix。 我会在Bioconductor支持站点上尝试它。 - KoenVdB
1
我的问题已经在Bioconductor支持网站上得到了回答:https://support.bioconductor.org/p/66586/#66623 - KoenVdB
1个回答

0
我在此发布Michael Lawrence的 答案 以避免链接破裂。还需要进行小错误修复以处理Rle以零结尾的情况。
# Convert from Rle to one column matrix
#
setAs("Rle", "Matrix", function(from) {
    rv <- runValue(from)
    nz <- rv != 0
    i <- as.integer(ranges(from)[nz])
    x <- rep(rv[nz], runLength(from)[nz])
    sparseMatrix(i=i, p=c(0L, length(x)), x=x,
                 dims=c(length(from), 1))
})


# Convert from DataFrame of Rle to sparse Matrix
#
setAs("DataFrame", "Matrix", function(from) {
  mat = do.call(cbind, lapply(from, as, "Matrix"))
  colnames(mat) <- colnames(from)
  rownames(mat) <- rownames(from)
  mat
})

很遗憾,它不再起作用了,因为as.integer现在在IRanges对象上失败,并显示错误Error in as.vector(x, mode = "integer") : no method for coercing this S4 class to a vector。有人有解决方法吗? - Charles Plessy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接