2 votes

Algorithme pour réaliser un graphique de cascade de mutations (codé en R)

Supposons que j'ai m gènes d'intérêt et n échantillons. Je note la mutation d'un gène à 1 et la non-mutation à 0, de sorte que j'ai une matrice m x n. Je veux un algorithme qui ordonne les données de façon à pouvoir reproduire le graphique matriciel ci-dessous. Je vais coder cela en R, donc le code est le bienvenu mais pas nécessaire.

En clair, je commence par ordonner les rangées de telle sorte que la rangée comportant le plus de mutations dans tous les échantillons soit en haut :

data.mutations <- data.mutations[order(rowSums(data.mutations), decreasing = TRUE), ]

Mais je n'arrive pas à trouver comment trier les colonnes. La première étape est facile, je trie les colonnes par la première ligne :

data.mutations <- data.mutations[ , order(data.mutations[1, ], decreasing = TRUE)]

Maintenant, je suis coincé. Une approche naïve nécessiterait beaucoup de boucles. Il doit y avoir une solution plus sympa.

Mutation waterfall

1voto

jwimberley Points 1146

Une colonne A doit apparaître à gauche d'une colonne B si A[1] > B[1]. En cas d'égalité, on compare A[2] à B[2], et ainsi de suite. En d'autres termes, un opérateur de comparaison est défini sur les colonnes en comparant leurs valeurs dans l'ordre décroissant du numéro de ligne. Ceci peut être codé dans une seule valeur scalaire en attribuant une valeur sum[r=1 à n] C[n]*2^(1-r). (Dans un langage autre que R, cela pourrait être fait en créant un entier dont les bits correspondent aux valeurs de la colonne). Ensuite, les colonnes doivent être triées par valeur décroissante de ce scalaire codé. En R,

n <- 15
m <- 20
p <- 0.15
mat <- matrix(0,n,m)
for (i in 1:n) {
  for (j in 1:n) {
    mat[i,j] = rbinom(1,1,0.15)
  }
}
print(mat)

# Order by row
mat <- mat[order(rowSums(mat),decreasing=TRUE),]

# Order by column
code <- function(column) {
  n <- length(column)
  pow <- 2^-(0:(n-1))
  return (column %*% pow)
}
mat <- mat[,order(apply(mat,2,code),decreasing=TRUE)]

print(mat)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X