如何获取共享至少4列共同集的最大行集?

时间:2015-01-18 09:53:09

标签: r matrix subset intersection

我有一个包含基因名称和样本编号的矩阵。 每行是指示检测到基因的样品的逻辑载体。基因必须出现在8个样本中的至少4个样本中才能使它成为现实(仍然在矩阵中)。即,该基质中的所有基因都出现在4个或更多样品中。

       Sample1  Sample2  Sample3  Sample4 Sample5 Sample6  Sample7  Sample8 
gene1  TRUE     FALSE    TRUE     TRUE    TRUE    FALSE    FALSE    FALSE
gene2  FALSE    TRUE     FALSE    TRUE    FALSE   TRUE     TRUE     FALSE
gene3  TRUE     TRUE     FALSE    TRUE    FALSE   TRUE     TRUE     FALSE
gene4  FALSE    FALSE    TRUE     FALSE   TRUE    FALSE    FALSE    TRUE
gene5  TRUE     TRUE     TRUE     TRUE    TRUE    FALSE    TRUE     TRUE
gene6  FALSE    FALSE    TRUE     FALSE   FALSE   TRUE     TRUE     TRUE
gene7  TRUE     TRUE     FALSE    FALSE   TRUE    TRUE     FALSE    FALSE
gene8  TRUE     TRUE     TRUE     TRUE    FALSE   FALSE    FALSE    FALSE

我还可以说我有表达后者的样本列表,例如:

> gene1
[1] "Sample1"  "Sample3"  "Sample4"  "Sample5"

如何获得属于一组4个样本(列)的最大基因组(行)?

编辑:这个问题源于尝试重新创建:

  

异常值分析基于样本(细胞)的假设   同一类型也有一组常见表达的基因。

     

异常值算法迭代修剪表达文件中的低表达基因,直到95%的剩余基因表达超过限制   您为一半样本设置的检测(LoD)值。

     

在   假设样本集包含少于50%的异常值。   这意味着后续计算将只包括一半   修剪基因表达最高的样本   名单。

     

修剪的基因列表代表上面存在的基因   至少一半样品或最均匀表达的LoD   基因 - 虽然它们可能不是最高或最低的   表达价值。

     

对于剩下的50%的样品,a   计算分布,表示它们的组合表达式   上面定义的基因列表的值。对于这种分布,   median表示该组的第50百分位表达值   数据

2 个答案:

答案 0 :(得分:2)

我猜你想要找到任何4个样本中共存的基因。你可以尝试类似的东西:

n = 4               
combs = combn(seq_along(colnames(mat)), n, simplify = F)
Filter(function(x) length(x) > 1, 
       setNames(lapply(combs, function(i) names(which(rowSums(mat[, i]) == n))), 
                lapply(combs, function(x) paste0(colnames(mat)[x], collapse = "; "))))
#$`Sample1; Sample2; Sample3; Sample4`
#[1] "gene5" "gene8"
#
#$`Sample1; Sample2; Sample4; Sample7`
#[1] "gene3" "gene5"
#
#$`Sample1; Sample3; Sample4; Sample5`
#[1] "gene1" "gene5"
#
#$`Sample2; Sample4; Sample6; Sample7`
#[1] "gene2" "gene3"

在哪里" mat":

mat = structure(c(TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, TRUE, TRUE, 
FALSE, TRUE, TRUE, FALSE, TRUE, FALSE, TRUE, TRUE, TRUE, FALSE, 
FALSE, TRUE, TRUE, TRUE, FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, 
TRUE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, TRUE, TRUE, FALSE, 
TRUE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, TRUE, TRUE, FALSE, 
FALSE, TRUE, TRUE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, 
FALSE, TRUE, TRUE, TRUE, FALSE, FALSE), .Dim = c(8L, 8L), .Dimnames = list(
    c("gene1", "gene2", "gene3", "gene4", "gene5", "gene6", "gene7", 
    "gene8"), c("Sample1", "Sample2", "Sample3", "Sample4", "Sample5", 
    "Sample6", "Sample7", "Sample8")))

答案 1 :(得分:1)

目前尚不清楚预期的结果是什么。如果“m1”是初始逻辑矩阵,则创建矩阵(“m2”)的子集,每个行至少有4个TRUE。如果您需要每行的TRUE元素的列名,请使用apply使用“MARGIN = 1”将其循环

m2 <- m1[rowSums(m1)>=4,]
apply(m2, 1, function(x) colnames(m2)[x])