使用filter_all()排除含指定值的行失效,求助解决方案
解决filter_all排除含指定值行的问题
问题原因
你原代码里的. != c("s", "u")是向量循环匹配逻辑,并非判断值是否属于目标集合。R会把c("s","u")循环对应到每个变量,导致判断出错——比如第二行的V2="s"会和"u"比较(循环到第二个元素),结果为TRUE;V3="e"又和"s"比较,结果也为TRUE,整行因此被错误保留。
正确写法
方法1:用%in%判断集合归属(兼容filter_all)
把!=换成! . %in%,明确检查当前值是否不在指定集合里,再配合all_vars()确保所有变量都满足条件:
test <- tibble(V1 = c("a", "b", "d", "f"), V2 = c("a", "s", "d", "g"), V3 = c("s", "e", "r", "u")) test %>% filter_all(all_vars(!. %in% c("s", "u")))
输出结果:
# A tibble: 1 × 3 V1 V2 V3 <chr> <chr> <chr> 1 d d r
方法2:用dplyr推荐的across语法(替代filter_all)
filter_all属于旧语法,现在dplyr更推荐用across配合everything()指定所有变量,写法更清晰:
test %>% filter(across(everything(), ~ !.x %in% c("s", "u")))
运行结果和方法1完全一致,这也是符合当前dplyr规范的写法。
内容的提问来源于stack exchange,提问作者Wilson Souza
相关产品推荐
相关产品推荐

