2015-01-17 2 views
2

У меня есть матрица, которая выглядит следующим образом:Subset столбцов матрицы, исключив все значения вектора

> expressionMatrix 

     Sample_1 Sample_2 Sample_3 Sample_4 Sample_5 
Gene_1   1   2   3   4   5  
Gene_2   6   7   8   9  10 

и вектор:

outliers <- c("Sample_2", "Sample_3") 

Если я прошу подмножество expressionMatrix что включает в себя только образцы в outliers, который работает отлично:

subset(expressionMatrix, select=outliers) 

      Sample_2 Sample_3 
    Gene_   2   3 
    Gene_2   7   8 

Однако, я не могу показаться, чтобы получить S ubset expressionMatrix, который включает все образцы, ЗА ИСКЛЮЧЕНИЕМ те, что указаны в outliers.

Я пробовал:

subset(expressionMatrix, select=-outliers) 

но возвращает ошибку:

Error in -(outliers) : invalid argument to unary operator 

Однако, с просьбой об исключении из значений в векторе (без кавычек) непосредственно делает работы:

subset(expressionMatrix, select=-c(Sample_2, Sample_3)) 

     Sample_1 Sample_4 Sample_5 
Gene_1   1   4   5  
Gene_2   6   9  10 

Я попытался сделать это с помощью выбросов с помощью конверсии а именно:

subset(expressionMatrix, select=-noquotes(outliers)) 

Но все та же ошибка.

Error in -noquote(outliers) : invalid argument to unary operator. 

Почему функция subset приема векторного объекта при запросе включения, но не тогда, когда просит исключение?

ответ

2

Во-первых, здесь есть тестовый объект

expressionMatrix<-as.data.frame(matrix(1:10, nrow=2, 
    dimnames=list(paste("Gene",1:2,sep="_"), 
    paste("Sample",1:5, sep="_")))) 

Так же, как вы не ставите в кавычки столбцов в параметре подмножества subset=, вы означало поставить некотируемые имена в параметре select=, как Что ж. subset «волшебно» преобразует имена в индексы так

select=-c(Sample_2, Sample_3) 

преобразуется в

select=-c(2,3) 

И вы можете индексировать data.frame с dd[, -c(2,3)] просто отлично. Однако вы никогда не могли использовать символ минус с символьным вектором. «Индексирование Netagive» работает только с целыми значениями. И если вы передадите вектор символов в select=, потому что свободных символов нет, они не будут разрешены индексам. Таким образом, вы завершаетесь с dd[, -c("Sample_2", "Sample_3")], который не работает. (Это произойдет, если вы перейдете в select=c("Sample_2", "Sample_3"), потому что это осталось «нетранслированным» и работает как dd[, c("Sample_2", "Sample_3")] просто отлично). Вы могли бы построить вызов в грязной дороге

outliers<-as.call(c(`c`, lapply(c("Sample_2","Sample_3"), as.name))) 
do.call("subset", list(quote(expressionMatrix), select=outliers)) 

, но если вы действительно хотите использовать строки, вы можете использовать более традиционные

outliers<-c("Sample_2","Sample_3") 
expressionMatrix[, setdiff(names(expressionMatrix), outliers)] 
+0

Спасибо за тщательное объяснение. Я до сих пор не понимаю, зачем передавать аргумент как 'select = - (noquote (outliers))' не работает. Я в основном передаю 'select = -c (Sample_2, Sample_3)', не я? – gaelgarcia

+2

@PinkSharpie - нет, потому что 'noquote()' создает объект класса noquote, который не совпадает с объектом класса "name". Под ним объект «noquote» все еще является символьным символом. Хотя я понимаю путаницу, они выглядят одинаково. –

+0

Плюс параметр 'select =' оставлен для ленивой оценки. Переменная «outliers» не будет достаточно быстро расширена в оценке для этого. Имена столбцов должны явно отображаться в параметре функции для расширения. – MrFlick

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