簡體   English   中英

使用 dplyr::c_across 和 filter_if 在同一調用中過濾無限值和 NA

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

我希望在同一個調用中使用帶有c_across和不推薦使用的filter_if filter帶有InfNA dataframe行:

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方法?

謝謝

我建議使用dplyr 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)))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM