【问题标题】:dplyr: Combining across and filter in groupsdplyr:在组中组合和过滤
【发布时间】:2021-04-27 18:20:14
【问题描述】:

我想filter 只是 x1、x2 和 x3 值以及第 5 和第 95 分位数之间的距离(id)。但在我的示例中,我没有成功将 across 与我的变量(x1、x2 和 x3)结合起来:

library(dplyr)

data <- tibble::tibble(id= paste0(rep("sample_",length(100)),rep(1:10,10)),x1 = rnorm(100),x2 = rnorm(100),x3 = rnorm(100))

data %>%
  group_by(id) %>%
  dplyr::filter(across(x1:x3, function(x) x > quantile(x, 0.05) 
                x < quantile(x, 0.95)))

#Error: Problem with `filter()` input `..1`.
#i Input `..1` is `across(...)`.
#i The error occurred in group 1: id = "sample_1".

请问,有什么想法吗?提前致谢!!

【问题讨论】:

    标签: r dplyr iqr


    【解决方案1】:

    如果您将代码更改为在每个条件之间使用&amp;(“AND”),您的函数将运行。

    data %>%
      group_by(id) %>%
      dplyr::filter(across(x1:x3, function(x) x > quantile(x, 0.05) & x < quantile(x, 0.95)))
    

    您还可以使用以下代码缩短代码:

    data %>%
      group_by(id) %>%
      filter(across(x1:x3, ~ .x > quantile(.x, 0.05) & .x < quantile(.x, 0.95)))
    

    但是,我认为filter 旨在与if_all 或if_any 一起使用(在dplyr 1.0.4 中引入;请参阅here),具体取决于您是想要所有选定的列还是任何选择的列来满足条件。

    例如:

    data %>%
      group_by(id) %>%
      filter(if_all(x1:x3, ~ .x > quantile(.x, 0.05) & .x < quantile(.x, 0.95)))
    
    data %>%
      group_by(id) %>%
      filter(if_any(x1:x3, ~ .x > quantile(.x, 0.05) & .x < quantile(.x, 0.95)))
    

    在您的情况下,if_all 和 across 给出相同的结果,但我不确定 across 是否保证始终与 if_all 表现相同。

    【讨论】:

      【解决方案2】:

      你在两个条件之间忘记了&amp;:

      library(dplyr)
      
      data <- tibble::tibble(id= paste0(rep("sample_",length(100)),rep(1:10,10)),x1 = rnorm(100),x2 = rnorm(100),x3 = rnorm(100))
      
      data %>%
        group_by(id) %>%
        dplyr::filter(across(.cols = x1:x3, function(x) x > quantile(x, 0.05) & 
                             x < quantile(x, 0.95)))
      
         id            x1      x2      x3
         <chr>      <dbl>   <dbl>   <dbl>
       1 sample_2 -0.0222 -1.17   -0.634 
       2 sample_4 -0.584   0.400  -1.01  
       3 sample_8 -0.462  -0.890   0.851 
       4 sample_1  1.39   -0.0418 -1.31  
       5 sample_2 -0.446   1.61   -0.0368
       6 sample_3  0.617  -0.148  -0.358 
       7 sample_4 -1.20    0.340   0.0903
       8 sample_6 -0.538  -1.10   -0.387 
       9 sample_9 -0.680   0.195  -1.51  
      10 sample_5 -0.779   0.419   0.720 
      

      【讨论】:

        猜你喜欢
        • 2021-10-25
        • 1970-01-01
        • 2021-12-28
        • 2018-06-02
        • 1970-01-01
        • 2017-05-06
        • 2017-08-23
        • 1970-01-01
        • 2012-08-17
        相关资源
        最近更新 更多