查找矩阵中的保守列
Find conserved columns in matrix
我需要一些帮助。
我有一个包含 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))
这是Biostring
包中的MultipleAlignment
对象,但我不关心对象的类型,我可以随时转换它。
我想从这个只有列的矩阵中提取一个矩阵
其中相同的元素(一行)代表列的 x%。
类似于 value on cell / sum values in a column
。
例如,在第 6 列中,W
出现 29 次,而此列中值的总和为 39,这意味着超过 74% 或 0,74(频率),因此如果我的截止值是 cutoff >= 0.7
它包含在最终矩阵中。
有一种简单的方法可以做到这一点。
我更喜欢 BioConductor
包(如 Biostring
)、tidyverse
甚至 R base
。
提前致谢。
这是一个选项,其中 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))]
我需要一些帮助。
我有一个包含 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))
这是Biostring
包中的MultipleAlignment
对象,但我不关心对象的类型,我可以随时转换它。
我想从这个只有列的矩阵中提取一个矩阵
其中相同的元素(一行)代表列的 x%。
类似于 value on cell / sum values in a column
。
例如,在第 6 列中,W
出现 29 次,而此列中值的总和为 39,这意味着超过 74% 或 0,74(频率),因此如果我的截止值是 cutoff >= 0.7
它包含在最终矩阵中。
有一种简单的方法可以做到这一点。
我更喜欢 BioConductor
包(如 Biostring
)、tidyverse
甚至 R base
。
提前致谢。
这是一个选项,其中 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))]