【问题标题】:How to remove rows Inf from a specific column in a dataframe using Tidyverse in R?如何使用 R 中的 Tidyverse 从数据框中的特定列中删除行 Inf?
【发布时间】:2021-05-07 15:25:54
【问题描述】:

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

例子:

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

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

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

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

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

【问题讨论】:

    标签: r dataframe dplyr tidyverse infinity


    【解决方案1】:

    你可以使用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)
    

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

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

    另见this question

    【讨论】:

    • 对不起,我忘了说列名是作为变量传递的。
    • 听起来很合理。但由于某种原因,它对我不起作用:(variable &lt;- 'CPC'在数据中有一列CPC。model_per_day &lt;- function (account, campaign_type, variable, forecast_period) { data_per_day &lt;- data %&gt;% filter(!is.infinite({{variable}})) )它不会抛出任何错误,但也不会删除Inf。
    • 代码是否适用于您提供的示例?您必须提供您正在使用的数据(即data)作为函数的第一个输入。
    • library('dplyr') df % filter(is.finite({{filter_col}})) } # 这行得通 - 但它传递了列名,我不想要 df %>% filter_infs(CPC) # 这行不通 - 而它具有作为变量传递的列名。它过滤掉所有行。 df %>% filter_infs(filter_col)
    • 抱歉都贴在一行里了。。这里不知道怎么回车。。。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-12
    • 1970-01-01
    • 2014-04-12
    • 1970-01-01
    • 1970-01-01
    • 2022-07-04
    • 2018-04-13
    相关资源
    最近更新 更多