R语言使用Tidyverse如何跨多变量按条件筛选数据且保留全列
R语言Tidyverse精准筛选行的实现方案
示例数据构造
animals <- c("Bat", "Monkey", "Tiger", "Frog", "Bald Eagle") Type <- c("mammal","mammal","mammal", "Amphibian", "Bird") Quantity <- c(8, 5, 1, 5, 1) Bananas <- c(0,1,0,0,0) Apples <- c(0,1,0,0,0) Crickets <- c(1,0,0,1,0) DF <- data.frame(animals, Type, Quantity,Bananas, Apples, Crickets)
原始数据结构:
animals Type Quantity Bananas Apples Crickets 1 Bat mammal 8 1 1 0 2 Monkey mammal 5 1 1 0 3 Tiger mammal 1 0 0 0 4 Frog Amphibian 5 0 0 1 5 Bald Eagle Bird 1 0 0 0
筛选规则
- 仅保留
Type字段取值为mammal的行 - 仅保留
Bananas、Apples、Crickets三个字段中任意一个取值为1的行
错误原因说明
此前使用filter_all(any_vars)出错的核心原因是该函数会对全表所有字段做匹配判断,Quantity字段的取值1也被纳入了匹配逻辑,导致错误返回Tiger对应的行。
正确实现代码
使用dplyr 1.0.0及以上版本推出的if_any()函数,可精准指定判断范围,不会影响其他字段,也不会丢失数据列:
library(tidyverse) result <- DF %>% filter( Type == "mammal", # 仅对指定的三个字段做「任意等于1」的判断 if_any(c(Bananas, Apples, Crickets), ~ .x == 1) )
输出结果验证
print(result) # animals Type Quantity Bananas Apples Crickets #1 Bat mammal 8 0 0 1 #2 Monkey mammal 5 1 1 0
该方案完全适配列数多的业务数据集,不需要对其他50余列做任何额外操作即可完整保留。
内容的提问来源于stack exchange,提问作者ks54
相关产品推荐
相关产品推荐

