【问题标题】:Filter across columns in dplyr过滤 dplyr 中的列
【发布时间】:2022-01-02 22:02:19
【问题描述】:

我想使用过滤器和跨函数过滤 iris 数据帧以仅返回 sepal.length、sepal.width、petal.length 和 petal.width 字段中值大于 2 的行。我有以下代码:

iris%>%
  filter(across(c(Sepal.Length, Sepal.Width , Petal.Length, Petal.Width), >2))

报错信息是有:Error: unexpected '>' in:

谁能建议修改代码来解决这个问题?

【问题讨论】:

    标签: r dplyr tidyverse


    【解决方案1】:

    一个可能的解决方案,基于dplyr

    library(dplyr)
    
    iris%>%
      filter(across(is.numeric, ~ .x > 2))
    

    或者:

    iris%>%
      filter(across(c(Sepal.Length,Sepal.Width,Petal.Length,Petal.Width), ~ .x > 2))
    

    甚至:

    iris%>%
      filter(across(ends_with(c("Length","Width")), ~ .x > 2))
    

    【讨论】:

      【解决方案2】:

      两种可能

      iris %>%
        filter(across(c(Sepal.Length, Sepal.Width , Petal.Length, Petal.Width), `>`, 2))
      
      iris %>%
        filter(across(c(Sepal.Length, Sepal.Width , Petal.Length, Petal.Width), ~ .x > 2))
      
      # or
      
      iris %>%
        filter(across(c(Sepal.Length, Sepal.Width , Petal.Length, Petal.Width), function(x) x > 2))
      

      让我们从第二个例子开始——我们使用匿名函数表示法,第一个是 purrr 的风格,第二个是经典风格。 Purrr 的风格只适用于某些包。

      现在第一个 - across() 想要作为第二个参数的是一个函数,但您需要使用前缀形式的函数 Advanced R。 R中的所有函数都有这种形式,但通常不需要使用它,例如:

      2 + 2
      `+`(2, 2)
      

      是一样的。

      across() 中,当您传递(作为第二个参数)函数时,您可以在逗号后传递可以传递给该函数的所有其他参数。对于>,第一个参数是第一个数字 - 并且有来自iris 的值,第二个参数是数字2,即您选择检查列中值的数字。

      【讨论】:

        【解决方案3】:

        使用dplyr 的潜在解决方案:

        iris %>% filter(Sepal.Length > 2 & Sepal.Width >2 & Petal.Length >2 & Petal.Width >2)
        

        还有精简版:

        iris %>% filter_at(vars(Sepal.Length, Sepal.Width, Petal.Length, Petal.Width),all_vars(.>2))
        

        【讨论】:

          猜你喜欢
          • 2018-03-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-06-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多