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

时间:2015-01-17 05:39:25

标签: r matrix vector 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

但是,我似乎无法获得包含所有样本的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函数在要求包含时接受向量对象,但在请求排除时却不接受?

1 个答案:

答案 0 :(得分: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)]