如何用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
相关产品推荐
相关产品推荐

