通过排除向量的所有值来子集矩阵的列
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)]
我有一个如下所示的矩阵:
> 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)]