【问题标题】:convert S4 DataFrame of Rle objects to sparse matrix in R将 Rle 对象的 S4 DataFrame 转换为 R 中的稀疏矩阵
【发布时间】:2015-04-13 15:31:26
【问题描述】:

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

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

现在,我想将此 DataFrame 转换为 Matrix 包中的稀疏矩阵。在通常的 data.frame 上,可以这样做

Matrix(x,sparse=TRUE)

但是,这不适用于 DataFrame,因为它会给出以下错误:

Matrix(x,sparse=TRUE)

Error in as.vector(data) : no method for coercing this S4 class to a vector

关于如何以一种相当有效的方式在数据类型之间进行转换的任何想法?

谢谢!

【问题讨论】:

  • Matrix(as.data.frame(x)); DataFrame 和 Rle 来自 Bioconductor S4Vectors 包,因此在Bioconductor support site 上询问有关它们的问题可能是合适的。
  • @MartinMorgan 感谢您的回复,但这不起作用。它返回错误 Error in asMethod(object) : invalid class 'NA' to dup_mMatrix_as_geMatrix 。我也会在 Bioconductor 支持网站上试用它。
  • 我的问题已在生物导体支持网站上得到解答:support.bioconductor.org/p/66586/#66623

标签: r s4


【解决方案1】:

我在此处发布 Michael Lawrence 的 answer 以避免链接中断。此外,它还需要一个小错误修复来处理 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
})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-26
    • 2023-04-10
    • 2021-11-25
    • 2017-07-02
    • 1970-01-01
    • 1970-01-01
    • 2018-05-30
    相关资源
    最近更新 更多