How to preserve base data frame rownames upon filtering in dplyr chain

Viewed 36359

I have the following data frame:


df <- structure(list(BoneMarrow = c(30, 0, 0, 31138, 2703), Pulmonary = c(3380, 
21223.3333333333, 0, 0, 27)), row.names = c("ATP1B1", "CYCS", 
"DDX5", "GNB2L1", "PRR11"), class = "data.frame", .Names = c("BoneMarrow", 
"Pulmonary"))

df 
#>        BoneMarrow Pulmonary
#> ATP1B1         30   3380.00
#> CYCS            0  21223.33
#> DDX5            0      0.00
#> GNB2L1      31138      0.00
#> PRR11        2703     27.00

What I want to do is to get rid of rows with values < 8 in any of the columns. I tried this but the row names (e.g. ATP1B1, CYCS etc) are gone:

> df %>% filter(!apply(., 1, function(row) any(row <= 8 )))
  BoneMarrow Pulmonary
1         30      3380
2       2703        27

How can I preserve that in dplyr chain?

4 Answers

For gene counts, you often want to know if at least x samples have more than y counts, rather than just across all samples.

Not as pretty as filter_if, but I'm not sure how you'd implement the same rowSums conditions using all_vars

   x <- sample_threshold  
   y <- count_threshold

   require(dplyr) 
   require(tibble)

   df %>%  
       tibble::rownames_to_column('gene') %>%  
       dplyr::filter(rowSums(dplyr::select(., -gene) > y) > x) %>%  
       tibble::column_to_rownames('gene')
Related