如何基于指定行子集的阈值规则筛选dataframe列
R 按行规则筛选DataFrame列实现方案
select_if完全可以实现你的需求,不需要额外做复杂的前置处理,只需要在列的判断逻辑中排除A行的取值参与校验即可。
dplyr 实现(匹配你提到的select_if思路)
library(dplyr) df1 %>% select_if(~ is.numeric(.x) && all(.x[df1$Gene != "A"] < 5))
逻辑拆解:
- 先通过
is.numeric(.x)过滤掉存基因名的非数值列Gene,避免字符串参与数值比较报错 - 对每个数值列,通过行索引
df1$Gene != "A"取出B到E行的所有取值 - 用
all()判断这些取值是否全部小于5,仅保留判断结果为TRUE的列
在你给出的示例数据上运行这段代码,会仅返回c1列,和你预期的结果完全一致。
Base R 实现(无第三方包依赖)
如果不想加载dplyr,用基础R语法也能快速实现:
# 定位所有非A行的索引 non_a_rows <- df1$Gene != "A" # 逐列校验是否符合保留规则 col_keep <- sapply(df1, function(col) is.numeric(col) && all(col[non_a_rows] < 5)) # 提取符合要求的列 df1[, col_keep, drop = FALSE]
内容的提问来源于stack exchange,提问作者pleasehelp
相关产品推荐
相关产品推荐

