This is a test version of Biostars. For the public version, visit https://www.biostars.org.
check for zeros in every column of R data frame

Hi All,

I have a dataframe in R with rows as genes and columns as samples with expression values for each gene. I would like to check if all the samples (columns) for each gene have an expression value > 0 and remove this gene (row) if the number of zeros are more than a certian number (10 or 15).

Instead of writing a for loop and checking through every cell, is there a direct/easiest way to do this?

Thanks a lot.

cheers, Aravind

r dataframe

Google for "Pre filtering rna-seq data, deseq2"

2 answers

Something like this should do the trick:

index <- rowSums( dataframe > threshold) >= 10 or 15
dataframe <- dataframe[index,]

And if it is related to differential expression analysis be careful in your choice of threshold.

generate random data

df <- data.frame(matrix(rexp(50, rate=.1), ncol=5))
df
          X1        X2        X3        X4        X5
1   6.740580 8.0732001 11.559373  3.852068  2.867826
2   8.017221 6.5130366  2.704126  8.905308 12.894070
3   6.727714 3.2452073 10.196754  3.307838 25.877438
4   5.965735 9.4551141  5.846683 23.719300 11.091497
5  15.263253 0.1952222 15.024644 21.170202 19.905295
6  22.297499 1.9259003  3.370276  2.223720  5.634376
7  18.492478 8.9295170  1.240304 34.976717  9.909120
8   2.029231 1.2276215  5.696635  4.990737 27.469183
9   3.686119 5.0614293  2.240032 19.733418  1.801601
10  4.641686 5.0175711 16.526846 35.593992 13.176071

check if all samples (columns) have at least 1 zero

all(apply(apply(df, 2, function(x) x==0), 2, any))
[1] FALSE

impute zero values in 4 of the 5 samples

df[2,1] <- 0
df[3,2] <- 0
df[1,3] <- 0
df[7,4] <- 0

all(apply(apply(df, 2, function(x) x==0), 2, any))
[1] FALSE

okay, impute a zero in the fifth sample so that all now have a single zero

df[10,5] <- 0
df
          X1        X2        X3        X4        X5
1   6.740580 8.0732001  0.000000  3.852068  2.867826
2   0.000000 6.5130366  2.704126  8.905308 12.894070
3   6.727714 0.0000000 10.196754  3.307838 25.877438
4   5.965735 9.4551141  5.846683 23.719300 11.091497
5  15.263253 0.1952222 15.024644 21.170202 19.905295
6  22.297499 1.9259003  3.370276  2.223720  5.634376
7  18.492478 8.9295170  1.240304  0.000000  9.909120
8   2.029231 1.2276215  5.696635  4.990737 27.469183
9   3.686119 5.0614293  2.240032 19.733418  1.801601
10  4.641686 5.0175711 16.526846 35.593992  0.000000

all(apply(apply(df, 2, function(x) x==0), 2, any))
[1] TRUE

Log in to answer this question.