首页 > 解决方案 > 使用 R 中的过滤器函数过滤具有多个变量的多个条件

问题描述

我正在处理一个数据集,我试图在开始对其运行操作之前过滤掉一些数据。但是,我遇到以下问题:

  1. 直到使用 select() 我从选定的变量中获取所有数据。

  2. 一旦我尝试对一个变量应用过滤器,它就会显示过滤后的数据。但是,一旦我尝试执行第二个条件,它就会打印出 0 个观察值。

任何帮助将非常感激。我试图弄清楚这是否只是语义上的错误,或者我缺少一些语法问题。我一直在寻找,无法找到解决方法。我觉得这个问题与逻辑运算符有关,但我无法弄清楚需要去那里。

不等于运算符用于数据集中的特定“编码”值。

编码:

select(X1, X2, X3, X4) %>%
filter(X1 != "97" &
       X1 != "98" &
       X1 != "99" &
       
       X2 != "88" &
       X2 != "77" &
       X2 != "99" &
       
     X3 != "88" &
     X3 != "77" &
     X4 != "99" & 
      
     !is.na(X1) 
     !is.na(X2)
     !is.na(X3) 
     !is.na(X4))

标签: rdplyr

解决方案


为了补充 Marcelo Avila 的答案,{dplyr} 中还有if_anyand if_all。请注意,您也可以使用NAinside ! .x %in% c(NA, 99, 88)

library(dplyr) 
# data taken from Marcelo's answer
vec <- c(NA, 80:99)
set.seed(42)
df <- data.frame(
  X1 = sample(vec, 20, replace = T), 
  X2 = sample(vec, 20, replace = T), 
  X3 = sample(vec, 20, replace = T), 
  X4 = sample(vec, 20, replace = T)) %>% as_tibble()

df %>% 
  filter(!if_any(X1:X4, is.na),
         !if_any(X1:X2, ~ .x %in% c(97, 98, 99)),
         !X3 %in% c(88, 77),
         X4 != 99)

#> # A tibble: 12 x 4
#>       X1    X2    X3    X4
#>    <int> <int> <int> <int>
#>  1    95    83    99    90
#>  2    88    86    84    89
#>  3    82    81    80    81
#>  4    95    88    81    83
#>  5    93    89    99    92
#>  6    85    93    80    83
#>  7    82    86    84    80
#>  8    92    82    86    95
#>  9    93    83    95    92
#> 10    81    82    85    86
#> 11    87    80    82    86
#> 12    91    95    87    82

reprex 包于 2021-06-26 创建(v0.3.0)


推荐阅读