2015-01-17 52 views
2

我有一個矩陣,看起來像這樣:子集列

> 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 

不過,我似乎無法獲得信其中包括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) 

,您可以用指數只是dd[, -c(2,3)]罰款data.frame。但是,您從來沒有能夠將減號與字符向量一起使用。 「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 - no,因爲'noquote()'創建一個類「noquote」對象,它與類「name」對象不同。在下面,「noquote」對象仍然是一個字符向量。雖然我理解這種混亂,但它們確實看起來一樣。 –

+0

加上'select ='參數留給懶惰評估。在評估中,「離羣值」變量在工作中不會很快擴展。列名必須顯式出現在函數的參數中才能展開。 – MrFlick