查找矩阵中的守恒列

时间:2019-03-20 23:40:26

标签: r matrix bioconductor

我需要一些帮助。

我有一个21行的矩阵和一个 先前未定义的列数(取决于输入)。 每个单元格都有一个数字,代表该行元素的次数 出现在同一列中。

structure(c(7L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 1L, 1L, 0L, 29L, 3L, 0L, 0L, 0L, 0L, 0L, 
35L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 3L, 0L, 0L, 0L, 0L, 0L, 35L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 3L, 0L, 1L, 0L, 0L, 2L, 0L, 0L, 
0L, 0L, 28L, 4L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 2L, 
0L, 0L, 0L, 0L, 0L, 37L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 3L, 0L, 0L, 0L, 0L, 
1L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 1L, 29L, 0L, 3L, 1L, 0L, 1L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 7L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 28L, 
0L, 0L, 1L, 0L, 0L, 0L, 34L, 1L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 
1L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 6L, 2L, 22L, 1L, 3L, 2L, 1L, 0L, 0L, 0L, 0L, 
2L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 1L, 1L, 0L, 1L, 0L, 4L, 0L, 
28L, 0L, 0L, 3L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 37L, 0L, 
0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 
0L, 0L, 0L, 0L, 36L, 1L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 1L, 32L, 6L, 0L, 0L, 0L, 0L, 0L, 28L, 0L, 0L, 
0L, 0L, 1L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 2L, 2L, 5L, 0L, 
0L, 0L, 0L, 2L, 0L, 31L, 1L, 0L, 0L, 2L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 2L, 1L, 4L, 0L, 0L, 0L, 0L, 0L, 
0L, 1L, 0L, 30L, 0L, 0L, 0L, 2L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 39L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 3L, 0L, 0L, 1L, 4L, 0L, 5L, 3L, 
0L, 2L, 0L, 4L, 0L, 0L, 0L, 1L, 0L, 12L, 4L, 0L, 0L, 0L, 4L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 35L, 
0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 1L, 0L, 4L, 0L, 0L, 0L, 0L, 6L, 
21L, 0L, 0L, 0L, 0L, 0L, 1L, 3L, 0L, 0L, 2L, 0L, 0L, 0L, 0L, 
0L, 0L, 38L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 
0L, 0L, 0L, 0L, 2L, 0L, 0L, 0L, 0L, 36L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 31L, 0L, 0L, 0L, 
0L, 2L, 0L, 0L, 0L, 2L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 4L, 0L, 0L, 
0L, 0L, 1L, 0L, 1L, 0L, 0L, 6L, 0L, 0L, 0L, 0L, 0L, 0L, 28L, 
2L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 1L, 2L, 0L, 0L, 0L, 0L, 0L, 0L, 
2L, 0L, 29L, 3L, 0L, 0L, 0L, 0L, 0L, 0L, 2L, 0L, 0L, 0L, 0L, 
1L, 0L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 31L, 2L, 0L, 0L, 0L, 0L, 
0L, 1L, 2L, 0L, 0L, 0L, 2L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 
28L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 5L, 0L, 0L, 1L, 0L, 0L, 0L, 
1L, 0L, 0L, 0L, 0L, 0L, 2L, 0L, 0L, 0L, 36L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 2L, 0L, 1L, 0L, 0L, 34L, 
1L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 1L, 1L, 0L, 0L, 
0L, 36L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 39L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
1L, 0L, 0L, 0L, 0L, 1L, 36L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 29L, 0L, 6L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 3L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 2L, 3L, 1L, 1L, 0L, 
0L, 28L, 1L, 0L, 0L, 0L, 0L, 1L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 39L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 1L, 0L, 1L, 0L, 0L, 33L, 0L, 2L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 2L), .Dim = c(22L, 
36L), .Dimnames = list(c("-", "A", "C", "D", "E", "F", "G", "H", 
"I", "K", "L", "M", "N", "P", "Q", "R", "S", "T", "V", "W", "X", 
"Y"), NULL))

这是MultipleAlignment包中的Biostring对象,但我不在乎对象的类型,我可以随时对其进行转换。

我想从只有一个列的那个矩阵中提取一个矩阵 其中同一元素(一行)代表该列的x%。
类似于value on cell / sum values in a column。 例如,在第6列上,W出现29次,其中该列的值之和为39,这意味着超过74%或0.74(频率),因此,如果我的截止值为cutoff >= 0.7它包含在最终矩阵中。

有一种简单的方法。

我更喜欢BioConductor软件包(如Biostringtidyverse甚至是R base

先谢谢了。

1 个答案:

答案 0 :(得分:2)

这里是一个选项,其中mat是您提供的输入:22x36矩阵

thres <- 0.7
out <- mat[, colSums((mat / colSums(mat)) >= thres) > 0]

您将删除三列

dim(out)
# [1] 22 33

这个想法是将矩阵除以列总和,然后检查结果是否大于或等于0.7。这给出了逻辑矩阵。然后,我们可以再次计算列的总和,并仅保留那些至少有一个TRUE的列。


由@ d.b提供的使用apply的另一个想法。在评论中

mat[, apply(mat, 2, function(x) any((x/sum(x)) > thres))]