我有一个包含基因名称和样本编号的矩阵。 每行是指示检测到基因的样品的逻辑载体。基因必须出现在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百分位表达值 数据
答案 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])