# [BioC] genefilter problem

Martin Morgan mtmorgan at fhcrc.org
Wed Mar 18 21:54:06 CET 2009

```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)
> [1] 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[1]> x
[1]  1  6 11 16 # Aha, a vector not a matrix with 1 row!
Browse[1]> 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)[[1]]
>     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

--
Martin Morgan
Computational Biology / Fred Hutchinson Cancer Research Center
1100 Fairview Ave. N.
PO Box 19024 Seattle, WA 98109

Location: Arnold Building M2 B169
Phone: (206) 667-2793

```