在矩阵中查找保守列

问题描述 投票:0回答:1

我想要一些帮助。

我有一个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包(如Biostring),tidyverse甚至R base

提前致谢。

r matrix bioconductor
1个回答
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))]
© www.soinside.com 2019 - 2024. All rights reserved.