преобразовать S4 DataFrame объектов Rle в разреженную матрицу в R

На языке R у меня есть S4 DataFrame, состоящий из элементов, закодированных Rle. Данные могут быть смоделированы с использованием следующего кода

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

Теперь я хочу преобразовать этот DataFrame в разреженную матрицу из пакета Matrix. На обычном data.frame можно сделать

Matrix(x,sparse=TRUE)

Однако это не работает для DataFrames, так как выдает следующую ошибку:

Matrix(x,sparse=TRUE)

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

Любые идеи о том, как преобразовать типы данных довольно эффективным способом?

Спасибо!


r s4
person KoenVdB    schedule 13.04.2015    source источник
comment
Matrix(as.data.frame(x)); DataFrame и Rle взяты из пакета Bioconductor S4Vectors, поэтому, вероятно, уместно задавать вопросы о них на сайте поддержки Bioconductor.   -  person Martin Morgan    schedule 13.04.2015
comment
@MartinMorgan Спасибо за ответ, однако это не работает. Он возвращает ошибку Error in asMethod(object) : invalid class 'NA' to dup_mMatrix_as_geMatrix . Я также попробую это на сайте поддержки Bioconductor.   -  person KoenVdB    schedule 14.04.2015
comment
На мой вопрос ответили на сайте поддержки биокондукторов: support.bioconductor.org/p/66586/# 66623   -  person KoenVdB    schedule 15.04.2015


Ответы (1)


Я публикую здесь ответ от Майкла Лоуренса, чтобы избежать разрыва ссылки. Также потребовалось небольшое исправление ошибки для обработки случая, когда 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
})
person Epimetheus    schedule 31.07.2016