This is a test version of Biostars. For the public version, visit https://www.biostars.org.
Filter data frame with dplyr

Hi there, I would like to filter my dataframe which is made of 5 columns, of which column1 contains gene names, column 2 contains Fold Changes (expressed as logFC), column 3 contains the FDR-adjusted p-value and the other two columns contain other things.

The thing is that my genes can be duplicated in the data.frame, so I would like to remove duplicated values. To remove duplicated values I am sorting by FDR to keep the gene (among the duplicates) that has the lowest FDR, by doing this: convertedata2 = convertedata %>% group_by(Geneid) %>% filter(FDR == min(FDR))

The problem is that some genes can have the same minimum FDR (e.g. if all genes have FDR=1), so they are not filtered.... To remove them, I would like to filter based on the logFC, and I would like to keep the gene that has the highest absolute(logFC). So I thought to change the previous command into this: convertedata2 = convertedata %>% group_by(Geneid) %>% filter(FDR == min(FDR)) %>% filter(logFC == max(abs(logFC))) but the problem is that it doesn't work... I suspect it has to do with the abs function, but I am not sure why and what is going on. Any help is much appreciated!

Thanks Luca

dplyr r filter

1 answer

Here is some example data.

df <- data.frame(Geneid=c("A","A","B","C"), FDR=c(0.01,0.01,0.25,0.025), logFC=rnorm(4,0,3))

> df
  Geneid   FDR     logFC
1      A 0.010  1.970233
2      A 0.010 -2.703701
3      B 0.250  3.957811
4      C 0.025 -2.641965

Here is how you would do the filtering (you were really close).

library("dplyr")

df <- df %>%
  group_by(Geneid) %>%
  filter(FDR == min(FDR) & abs(logFC) == max(abs(logFC))) %>%
  ungroup

> df
# A tibble: 3 x 3
# Groups:   Geneid [3]
  Geneid   FDR logFC
  <chr>  <dbl> <dbl>
1 A      0.01  -2.70
2 B      0.25   3.96
3 C      0.025 -2.64

Thanks rpolicastro! You are always super helpful!

Log in to answer this question.