根据名称模式选择的列中的条件过滤数据框

Filter a dataframe based on condition in columns selected by name pattern

我有一个包含多列的数据框

# Temp Data
library(dplyr)

df <- as.data.frame(matrix(seq(1:40),ncol=6,nrow=40))
colnames(df) <- c("A_logFC", "B_logFC", "C_logFC", "A_qvalue", "B_qvalue", "C_qvalue")

我想过滤掉那些在所有条件(A、B、C)中 qvalue 都低于阈值的行。

我可以通过分别过滤每一列来做到这一点

df %>%
  filter(A_qvalue < 0.05 & B_qvalue < 0.05 & C_qvalue < 0.05)

但真实的数据框有 15 列带有 q 值。

我还尝试重塑数据框(发现

df_ID = DEGs_df %>% mutate(ID = 1:n())

df_ID %>%
  select(contains("qval"), ID) %>% 
  gather(variable, value, -ID) %>% 
  filter(value < 0.05) %>%
  semi_join(df_ID)

但是我无法过滤那些在所有条件下 q 值都低于阈值的行。

从概念上讲,它类似于

df %>%
  filter(grep("q_value",.) < 0.05) 

但这也不起作用。

关于如何解决这个问题有什么建议吗?提前致谢!

您可以使用 if_all:

一次 filter 多个列
library(dplyr)

df %>%
  filter(if_all(matches("_qvalue"), ~ . < 0.05))

在这种情况下,我对名称匹配 _qvalue.

的所有列使用过滤条件 x < 0.05

如果您先按 ID 分组,然后在过滤器中使用 all,您的第二种方法也可以工作:

df_ID = df %>% mutate(ID = 1:n())

df_ID %>%
  select(contains("qval"), ID) %>% 
  gather(variable, value, -ID) %>% 
  group_by(ID) %>% 
  filter(all(value < 0.05)) %>%
  semi_join(df_ID, by = "ID")