[BioC] genefilter problem

Wayne Xu wxu at msi.umn.edu
Wed Mar 18 22:31:39 CET 2009

Thanks Martin,

Wayne
--

Martin Morgan wrote:
> Hi Wayne --
>
> Wayne Xu <wxu at msi.umn.edu> writes:
>
>
>> Hello,
>>
>> I created a filter function to filter the microarray data set by row
>> variance, but got follow error:
>>
>>  > dim(data1)
>>  7129   38
>>  > data1[1,2:4]
>>   data[, 4] data[, 6] data[, 8]
>> 1      -139       -76      -135
>>
>>
>>  > myfilter<-function(j){
>> +    function(x){
>> +    rowVars(x)<j
>> +    }
>> + }
>>  >
>>  > ff<-filterfun(myfilter(20))
>>  > filt<-genefilter(data1,ff)
>> Error in rowSums(!is.na(x)) :
>>   'x' must be an array of at least two dimensions
>>
>
> genefilter feeds the filter function each row as a simple vector, so
> try
>
>   myfilter = function(j) function(x) var(x) < j
>
> Here's what I did...
>
>
>> m = matrix(1:20, 5)
>> myfilter = function(j) function(x) rowVars(x) < j
>> options(error=recover)
>> genefilter(m, filterfun(myfilter(2)))
>>
> genefilter(m, filterfun(myfilter(2)))
> Error in rowSums(!is.na(x)) :
>   'x' must be an array of at least two dimensions
>
> Enter a frame number, or 0 to exit
>
> 1: genefilter(m, filterfun(myfilter(2)))
> 2: apply(expr, 1, flist)
> 3: FUN(newX[, i], ...)
> 4: fun(x)
> 5: rowVars(x)
> 6: rowSums(!is.na(x))
>
> Selection: 4
> Called from: eval(expr, envir, enclos)
> Browse> x
>   1  6 11 16 # Aha, a vector not a matrix with 1 row!
> Browse> Q
>
>> options(error=NULL)
>>
>
> Hope that helps,
>
> Martin
>
>
>> I know the error occurred in:
>>  > rowSums
>> function (x, na.rm = FALSE, dims = 1)
>> {
>>     if (is.data.frame(x))
>>         x <- as.matrix(x)
>>     if (!is.array(x) || length(dn <- dim(x)) < 2)
>>         stop("'x' must be an array of at least two dimensions")
>>     if (dims < 1 || dims > length(dn) - 1)
>>         stop("invalid 'dims'")
>>     p <- prod(dn[-(1:dims)])
>>     dn <- dn[1:dims]
>>     z <- if (is.complex(x))
>>         .Internal(rowSums(Re(x), prod(dn), p, na.rm)) + (0+1i) *
>>             .Internal(rowSums(Im(x), prod(dn), p, na.rm))
>>     else .Internal(rowSums(x, prod(dn), p, na.rm))
>>     if (length(dn) > 1) {
>>         dim(z) <- dn
>>         dimnames(z) <- dimnames(x)[1:dims]
>>     }
>>     else names(z) <- dimnames(x)[]
>>     z
>> }
>> <environment: namespace:base>
>>
>> I wrote other filters and they work fine, but the rowVars or rowSums
>> function does not work for me.
>>
>> Can someone help? Thanks in advance !
>>
>> Wayne
>>
>
>