我需要一些帮助。
我有一个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
。
先谢谢了。
答案 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))]