我有一个含有基因名称和样本编号的矩阵。每一行都是一个逻辑向量,指示检测到基因的样本。基因必须至少出现在8个样本中的4个样本中才能做到这一点(仍在矩阵中)。也就是说,这个矩阵中的所有基因都出现在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%的样本,计算了一个分布,它代表了上面定义的基因列表的组合表达值。对于此分布,中位数表示数据集的第50个百分位数表达式值。
发布于 2015-01-18 12:30:01
我猜你想要找到任何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 = 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")))
发布于 2015-01-18 11:21:57
目前还不清楚预期的结果是什么。如果"m1“是初始逻辑矩阵,则创建矩阵的子集("m2"),每一行至少有4个TRUE。如果需要对每一行都为真的元素的列名,请使用apply
将其循环为"MARGIN=1“。
m2 <- m1[rowSums(m1)>=4,]
apply(m2, 1, function(x) colnames(m2)[x])
https://stackoverflow.com/questions/28008543
复制相似问题