制作变异瀑布图的算法(用R编码)

时间:2017-06-08 13:45:49

标签: r algorithm sorting

假设我有m个感兴趣的基因和n个样本。我将一个基因的突变评为1,将非突变评为零,这样我就得到了一个m×n矩阵。我想要一个对数据进行排序的算法,以便我可以重现下面的矩阵图。我在R中对此进行编码,因此代码是受欢迎的,但不是必需的。

显然,我首先对行进行排序,使得所有样本中突变最多的行是最高的:

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

我无法弄清楚如何对列进行排序。第一步很简单,我按第一行对列进行排序:

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

现在我陷入困境。一种天真的方法需要很多循环。必须有一个更好的解决方案。

Mutation waterfall

1 个答案:

答案 0 :(得分:1)

如果A [1]> A,则列A应出现在列B的左侧。 B [1]。如果是平局,请将A [2]与B [2]进行比较,依此类推。换句话说,通过按行号的降序比较它们的值,在列上定义比较运算符。通过赋值sum [r = 1到n] C [n] * 2 ^(1-r),可以将其编码为单个标量值。 (在R以外的语言中,可以通过创建一个整数,其位对应于列的值来完成)。然后,列应按此编码标量的递减值排序。在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)