如何在R中移除含Blank列存在值>0的行以子集化数据框?
解决R中自动筛选含"Blank"列无正值行的问题
这问题我熟!你不用手动逐个指定Blank列,通过自动匹配列名的方法就能高效完成筛选,给你两种常用的实现方式:
方法一:Base R 原生实现
先自动定位所有列名包含"Blank"的列,再判断每行在这些列中是否没有大于0的值:
# 找出所有列名含"Blank"的列 blank_cols <- grep("Blank", names(df), value = TRUE) # 筛选出所有Blank列值均不大于0的行 df2 <- df[rowSums(df[blank_cols] > 0) == 0, ]
逻辑解释:
grep("Blank", names(df), value = TRUE)会返回所有列名包含"Blank"的列名向量,实现自动匹配;df[blank_cols] > 0生成一个布尔矩阵,每个元素标记对应位置的值是否大于0;rowSums()对每行的布尔值求和(TRUE视为1,FALSE视为0),求和结果为0意味着该行所有Blank列的值都≤0,正是我们需要保留的行。
你也可以用subset()函数改写,逻辑完全一致:
df2 <- subset(df, subset = rowSums(df[blank_cols] > 0) == 0)
方法二:dplyr(Tidyverse)实现
如果你习惯用tidyverse风格的代码,dplyr的if_all()函数能更简洁地完成这个需求:
library(dplyr) df2 <- df %>% filter(if_all(contains("Blank"), ~ .x <= 0))
逻辑解释:
contains("Blank")自动匹配所有列名包含"Blank"的列;if_all()检查所有匹配到的列是否都满足.x <= 0的条件,只有满足条件的行才会被保留。
两种方法运行后得到的结果都和你期望的一致:
ID OTU1 OTU2 Blank1 Blank2 2 3 3 0 0 4 2 0 0 0
内容的提问来源于stack exchange,提问作者s.shi
相关产品推荐
相关产品推荐

