dplyr::select 或 dplyr::filter - 如果所有值均为 TRUE

问题描述 投票:0回答:1

我有这种数据框,但总共有 14294 个 Gene_ID 和 36 个 Exp 列。

Gene_ID Exp_A   Exp_B   Exp_C    Exp_D
Gene1   TRUE    FALSE   FALSE    FALSE
Gene2   TRUE    TRUE    FALSE    TRUE
Gene3   TRUE    TRUE    FALSE    FALSE
Gene4   TRUE    FALSE   FALSE    TRUE
Gene5   FALSE   FALSE   FALSE    FALSE

我正在尝试根据 TRUE 的数量来

filter
行。我对 Gene_ID 感兴趣,其中除了一个值之外的所有值都是 TRUE,或者只有三个值都是 TRUE,等等。

我尝试过使用过滤器。我还尝试过转置数据框,其中每一列都是一个 Gene_ID,并尝试选择。

没有什么真正有效的。我也遇到了一些错误。例如:

df %>% filter(if_any(everything(), ~ .x == TRUE))

给了我一个

Error: evaluation nested too deeply: infinite recursion / options(expressions=)?
Error during wrapup: evaluation nested too deeply: infinite recursion / options(expressions=)?
Error: no more error handlers available (recursive errors?); invoking 'abort' restart

有没有最好的 dplyr 函数来做到这一点?

r select dplyr filter
1个回答
0
投票

假设您确实有一个包含逻辑

Exp_
列的 data.frame,您可以使用
pick()
进行子集化,使用
rowSums()
进行计数:

library(dplyr)

read.table(header = TRUE, text = 
"Gene_ID Exp_A   Exp_B   Exp_C    Exp_D
Gene1   TRUE    FALSE   FALSE    FALSE
Gene2   TRUE    TRUE    FALSE    TRUE
Gene3   TRUE    TRUE    FALSE    FALSE
Gene4   TRUE    FALSE   FALSE    TRUE
Gene5   FALSE   FALSE   FALSE    FALSE") |> 
  filter(rowSums(pick(starts_with("Exp")) == TRUE) == 3)
#>   Gene_ID Exp_A Exp_B Exp_C Exp_D
#> 1   Gene2  TRUE  TRUE FALSE  TRUE

创建于 2024 年 11 月 11 日,使用 reprex v2.1.1

© www.soinside.com 2019 - 2024. All rights reserved.