dplyr中如何基于多个条件组合筛选数据框列
报错原因
代码报错和警告来自两个写法问题:
where()要求输入必须是接收列作为输入、返回单值TRUE/FALSE的判断函数,直接用&连接两个独立的where()调用得到的不是合法判断函数,因此触发格式报错。- 原写法中数值比较逻辑会直接在字符类型的X列上运行,触发“将字符类型参数强制转换为逻辑值”的警告,进一步导致判断逻辑无法返回合规结果。
正确实现方案
写法1:单where内合并判断条件
把两个筛选条件写在同一个where()的匿名函数中,用短路逻辑符&&连接:先判断列是否为数值类型,如果不是直接跳过后续数值比较,从根源避免类型错误。
library(dplyr) # 示例数据构造 X <- c("B", "C", "D", "E") a1 <- c(1, 0, 3, 0) a2 <- c(235, 270, 100, 1) a3 <- c(3, 1000, 900, 2) df1 <- data.frame(X, a1, a2, a3) # 选列操作 df1 %>% select(where(~ is.numeric(.x) && all(.x < 5)))
运行后仅保留符合要求的a1列。
写法2:多where并列传参
select()中逗号分隔的筛选条件默认取交集,因此可以直接把两个where()作为独立参数传入:第一个条件先筛掉所有非数值列,第二个条件仅在剩余数值列上判断值是否全部小于5,不会触发类型警告:
df1 %>% select( where(is.numeric), where(~ all(.x < 5)) )
两种写法运行结果完全一致。
内容的提问来源于stack exchange,提问作者Chris Ruehlemann
相关产品推荐
相关产品推荐

