如何使用R中的Tidyverse从数据框中的特定列中删除行Inf?

问题描述

我有一个数据框,我想删除所选列中存在 Inf 值的行。我正在寻找使用 tidyverse 的解决方案,因为我想将其包含到我的 tidyverse 管道中。

示例:

df <- data.frame(a = c(1,2,3,NA),b = c(5,Inf,8,8),c = c(9,10,11),d = c('a','b','c','d'))

我想删除c 中具有 Inf 值的行。结果是:

df2 <- data.frame(a = c(1,'d'))

我希望有一个类似于 drop_inf()函数,类似于 drop_na()

编辑:列名作为变量传递。

解决方法

您可以使用is.finite

df %>%
  filter(is.finite(c))

   a   b  c d
1  1   5  9 a
2  2 Inf 10 b
3 NA   8 11 d

如果你想有一个动态列,你可以使用{{ }}

my_fun <- function(df,filter_col){
  df %>%
  filter(is.finite({{filter_col}}))
}

my_fun(df,b)
my_fun(df,c)

通过这种方式,您可以像处理其他 my_fun 动词一样动态处理 dplyr。 例如:

df %>% select(a:c) %>% my_fun(c)

另见this question