首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何获得共享至少4列的公共集的最大行集?

如何获得共享至少4列的公共集的最大行集?
EN

Stack Overflow用户
提问于 2015-01-18 09:53:09
回答 2查看 72关注 0票数 2

我有一个含有基因名称和样本编号的矩阵。每一行都是一个逻辑向量,指示检测到基因的样本。基因必须至少出现在8个样本中的4个样本中才能做到这一点(仍在矩阵中)。也就是说,这个矩阵中的所有基因都出现在4个或4个以上的样本中。

代码语言:javascript
运行
复制
       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

我也可以说,我有表示后者的样本清单,例如:

代码语言:javascript
运行
复制
> gene1
[1] "Sample1"  "Sample3"  "Sample4"  "Sample5"

如何才能获得属于4个样本(列)的公共集合中最大的一组基因(行)?

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

离群点分析是基于这样的假设,即同一类型的样本(细胞)也有一组共同表达的基因。 离群点算法迭代地对表达文件中的低表达基因进行修剪,直到95%的剩余基因的表达超过了为一半样本设定的检测极限(LoD)值。 假设样本集包含不到50%的离群值。这意味着,随后的计算将只包括一半的样本,其中有最高表达的修剪基因列表。 修剪后的基因列表表示至少一半样本中存在于LoD之上的基因或表达最均匀的基因--尽管它们的表达值可能不是最高的或最低的。 对于剩下的50%的样本,计算了一个分布,它代表了上面定义的基因列表的组合表达值。对于此分布,中位数表示数据集的第50个百分位数表达式值。

EN

回答 2

Stack Overflow用户

发布于 2015-01-18 12:30:01

我猜你想要找到任何4个样本中共存的基因。你可以尝试这样的方法:

代码语言:javascript
运行
复制
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"

“垫子”:

代码语言:javascript
运行
复制
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")))
票数 2
EN

Stack Overflow用户

发布于 2015-01-18 11:21:57

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

代码语言:javascript
运行
复制
m2 <- m1[rowSums(m1)>=4,]
apply(m2, 1, function(x) colnames(m2)[x])
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28008543

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档