根据名称模式选择的列中的条件过滤数据框
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")
我有一个包含多列的数据框
# 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")