我有一个如下所示的矩阵:
> 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
子集,则效果很好:
subset(expressionMatrix, select=outliers)
Sample_2 Sample_3
Gene_ 2 3
Gene_2 7 8
但是,我似乎无法获得包含除异常值
中的样本之外的所有样本的expressionMatrix
子集。
我尝试过:
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
函数在请求包含时接受向量对象,但在请求排除时不接受?
最佳答案
首先,这是一个测试对象
expressionMatrix<-as.data.frame(matrix(1:10, nrow=2,
dimnames=list(paste("Gene",1:2,sep="_"),
paste("Sample",1:5, sep="_"))))
正如您不在子集的 subset=
参数中的列周围添加引号一样,您也应该在 select=
参数中添加不带引号的名称以及。 子集
“神奇地”将名称转换为索引,因此
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)]
关于r - 通过排除向量的所有值来对矩阵的列进行子集化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27996548/