我有一个看起来像这样的矩阵:
> 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
函数在要求包含时接受向量对象,但在请求排除时却不接受?
答案 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)]