2015-01-18 2 views
2

У меня есть матрица, содержащая имена генов и номера образцов. Каждая строка является логическим вектором, указывающим образцы, в которых был обнаружен ген. Гены должны появляться как минимум из 4 образцов из 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 образцов (столбцов)?

Редактировать: Этот вопрос вытекает из пытаюсь воссоздать этот:

анализа Outlier основан на предположении, что образцы (клетка) те же типа также имеет набор наиболее часто выраженные гены.

Алгоритм вытеснения итеративно обрезает низко выражающие гены в файле экспрессии до тех пор, пока 95% оставшихся генов не вырастут выше предела значения обнаружения (LoD), установленного для половины выборок.

Предполагается, что набор образцов содержит менее 50% выбросов. Это означает, что последующие вычисления будут включать только половину образцов, которые имеют самое высокое выражение для обрезанного гена .

Кадрированное список генов представляет гены, которые присутствуют выше Лода, по крайней мере, половина образцов или наиболее равномерно выражены гены, хотя они не могли бы быть самым высоким или самым низким в их выражения стоимости.

Для 50% оставшихся образцов вычисляется распределение , которое представляет собой их комбинированное выражение значений для списка генов, определенного выше. Для этого распределения медиана представляет значение выражения 50-го процентиля для набора данных .

+0

Может быть 'm2 <- m1 [rowSums (m1)> = 4,]; apply (m2, 1, function (x) colnames (m2) [x]) ' – akrun

+0

Спасибо за ваш ответ @akrun. Можете ли вы объяснить, что делает ваша функция? – gaelgarcia

+0

Я не уверен, так как мне непонятно, для чего предназначена функция apply (x). – gaelgarcia

ответ

1

Непонятно, каков ожидаемый результат. Если «m1» является исходной логической матрицей, создайте подмножество матрицы («m2»), которая имеет по крайней мере 4 TRUE для каждой строки. Если вам нужны имена столбцов элементов, которые истинны для каждой строки, петли это с помощью apply с «MARGIN = 1»

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

Спасибо! Я думаю, что это может приблизить меня к тому, что я хочу, но короткий один шаг - это скажет мне каждый ген, в котором было обнаружено 4 (или более) образца. Я все равно должен был бы найти уникальные комбинации в этом списке и найти тот, у которого есть большинство вхождений, вроде 'uniq -c | sort '. – gaelgarcia

+0

@PinkSharpie Вы проверили решение alexis_laz? Пожалуйста, обновите свой пост с ожидаемым результатом, чтобы было легче кодировать – akrun

+0

Да, в настоящее время отвечает на сообщение, но я думаю, что это приближает меня. – gaelgarcia

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 = 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"))) 
+0

Я думаю, это может быть то, чего хотел OP. В любом случае, будем ждать ответа OP. (+1) – akrun

+0

Спасибо. Я предполагаю, что это даст мне значительное количество комбинаций образцов, когда у меня будет список из 96 образцов, с которыми я работаю. В этом упрощенном примере комбинации образцов могут быть 4 или более. По моим данным, мне пришлось бы вычислить все комбинации из 48 или более образцов. Будет ли это достижимо без сбоев моего компьютера? Полагаю, мне тогда нужно было бы найти комбинацию с большинством образцов. – gaelgarcia

Смежные вопросы