You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用dplyr筛选含指定数量TRUE值的基因数据行?

问题描述

我有一个包含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值的数量筛选行,例如筛选除一个值外其余全为TRUE、仅含三个TRUE值的Gene_ID等。尝试用dplyr::filter和转置后用dplyr::select均未成功,还出现递归错误:

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函数可完成此操作?

解决方案

直接用dplyr结合rowSums就能高效完成这类筛选,不需要转置或复杂操作,可避免递归错误:

  • 筛选仅含3个TRUE值的行
    逻辑值在数值计算中会自动转为1(TRUE)和0(FALSE),用rowSums()统计每行Exp列的TRUE数量,再通过filter()筛选:

    library(dplyr)
    
    # 假设数据框名为df
    df_filtered_3 <- df %>%
      filter(rowSums(across(starts_with("Exp_"))) == 3)
    
  • 筛选除一个值外其余全为TRUE的行
    36个Exp列仅1个FALSE,即TRUE数量为35,修改判断条件即可:

    df_filtered_35 <- df %>%
      filter(rowSums(across(starts_with("Exp_"))) == 35)
    
  • 扩展其他筛选场景
    比如筛选含2-5个TRUE值的行:

    df_filtered_range <- df %>%
      filter(between(rowSums(across(starts_with("Exp_"))), 2, 5))
    

递归错误原因说明

你之前的操作大概率是手动罗列了36个Exp列的判断条件(比如逐个写Exp_A == TRUE相加),这种写法会导致表达式嵌套过深,触发R的递归限制。用across()批量选中Exp列再计算,能从根源避免这个问题。

内容的提问来源于stack exchange,提问作者Nuria

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 08:54:58