通过排除向量的所有值来子集矩阵的列

Subset columns of a matrix by excluding all values of a vector

我有一个如下所示的矩阵:

> 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)

但是returns一个错误:

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 函数在请求包含时接受矢量对象,但在请求排除时却不接受?

首先,这里有一个测试对象

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

正如您不在 subset 的 subset= 参数中的列周围放置引号一样,您也应该在 select= 参数中放置不带引号的名称。 subset "magically" 将名称转换为索引,因此

select=-c(Sample_2,  Sample_3)

转换为

select=-c(2,3)

你可以用 dd[, -c(2,3)] 索引 data.frame 就好了。但是,您从未能够将减号与字符向量一起使用。 "Netagive indexing" 仅适用于整数值。如果将字符向量传递给 select=,因为没有空闲符号,它们不会解析为索引。所以你最终得到 dd[, -c("Sample_2", "Sample_3")] 这是行不通的。 (如果你传入 select=c("Sample_2", "Sample_3"),它就会工作,因为它被留下 "untranslated" 并以 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)]