2015-04-13 2 views
3

Dans le langage R, j'ai un S4 DataFrame constitué d'éléments codés Rle. Les données peuvent être simulées en utilisant le code suivantconvertir S4 DataFrame des objets Rle en matrice clairsemée dans R

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

Maintenant, je veux convertir cette trame de données à une matrice clairsemée du paquet Matrix. Sur un data.frame d'habitude, on peut faire

Matrix(x,sparse=TRUE) 

Cependant, cela ne fonctionne pas pour DataFrames, car il donne l'erreur suivante:

Matrix(x,sparse=TRUE) 

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

Toutes les idées sur comment convertir entre les types de données d'une manière plutôt efficace?

Merci!

+0

'Matrix (as.data.frame (x))'; DataFrame et Rle sont issus du package Bioconductor S4Vectors, il est donc probablement approprié de poser des questions à leur sujet sur le [site de support de Bioconductor] (https://support.bioconductor.org). –

+0

@MartinMorgan Merci pour la réponse, mais cela ne fonctionne pas. Il renvoie l'erreur 'Erreur dans asMethod (objet): classe invalide 'NA' à dup_mMatrix_as_geMatrix'. Je vais aussi l'essayer sur le site de support de Bioconductor. – KoenVdB

+1

Ma question a été répondue sur le site de support du bioconducteur: https://support.bioconductor.org/p/66586/#66623 – KoenVdB

Répondre

0

Je poste le answer de Michael Lawrence ici pour éviter le lien cassant. En outre, il fallait un petit correctif pour gérer le cas où un Rle se termine par zéro:

# 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 
})