使用 dplyr::c_across 和 filter_if 在同一调用中过滤无限值和 NA

filter infinite values and NAs in same call using dplyr::c_across and filter_if

我希望在同一调用中使用 filterc_across 过滤 dataframeInfNA 并弃用 filter_if:

library(dplyr)

df <- tibble(a = c(1, 2, 3, NA, 1), b = c(5, Inf, 8, 8, 3), c = c(9, 10, Inf, 11, 12), d = c('a', 'b', 'c', 'd', 'e'), e = c(1, 2, 3, 4, -Inf))
# # A tibble: 5 x 5
#       a     b     c d         e
#   <dbl> <dbl> <dbl> <chr> <dbl>
# 1     1     5     9 a         1
# 2     2   Inf    10 b         2
# 3     3     8   Inf c         3
# 4    NA     8    11 d         4
# 5     1     3    12 e      -Inf
 

我可以使用 c_acrossfilter_if 在两次调用中完成此操作:

df %>% 
  rowwise %>% 
  filter(!any(is.infinite(c_across(where(is.numeric))))) %>% 
  filter(!any(is.na(c_across(where(is.numeric)))))
# # A tibble: 1 x 5
# # Rowwise: 
#       a     b     c d         e
#   <dbl> <dbl> <dbl> <chr> <dbl>
# 1     1     5     9 a         1

#OR filter_if:
df %>% 
  filter_if(~is.numeric(.), all_vars(!is.infinite(.))) %>% 
  filter_if(~is.numeric(.), all_vars(!is.na(.)))
# # A tibble: 1 x 5
#       a     b     c d         e
#   <dbl> <dbl> <dbl> <chr> <dbl>
# 1     1     5     9 a         1

如何在对 filter(和 filter_if)的一次调用中执行这两种方法?也可能有 across 方法?

谢谢

我建议使用 across() 来自 dplyr 的方法:

library(dplyr)
#Data
df <- tibble(a = c(1, 2, 3, NA, 1),
             b = c(5, Inf, 8, 8, 3),
             c = c(9, 10, Inf, 11, 12),
             d = c('a', 'b', 'c', 'd', 'e'),
             e = c(1, 2, 3, 4, -Inf))
#Mutate
df %>% filter(across(c(a:e), ~ !is.na(.) & !is.infinite(.)))

输出:

# A tibble: 1 x 5
      a     b     c d         e
  <dbl> <dbl> <dbl> <chr> <dbl>
1     1     5     9 a         1

试试这个。使用 where 来标识您的数字列。

 df %>% 
  filter(across(.cols = where(is.numeric),
                .fns = ~!is.infinite(.x) & !is.na(.x)))