【问题标题】:Complex dplyr group_by filtering复杂的 dplyr group_by 过滤
【发布时间】:2020-01-27 15:37:21
【问题描述】:

我不知道如何在 tidyverse 中为组编写复杂的过滤条件。考虑下面的示例数据框:

df <- tibble(
    a = c(1,1,1,2,2,2,2,3), 
    b = c(1,2,3,1,4,50,5,3),
    c = c("PIZZA", "HAM", NA, "COKE", "LOBSTER", "LOBSTER", NA, NA),
)

我想a作为我的分组变量,然后选择b中记录最大的记录,使得c中的条目不是NA。 期望的输出:

tibble(
    a = c(1, 2, 3),
    b = c(2, 50, 3),
    c = c("HAM", "LOBSTER", NA)
)

我当然可以

df %>% group_by(a) %>% filter(b == max(b))

但是我不满足列c 标准。一些并发症:

  1. 组间记录数不一致。
  2. 如果组中所有记录的c记录为NA,则选择NA最大的b记录。

【问题讨论】:

  • 为什么不只过滤去除 c 的 NA 值,然后过滤最大 b?另外,= 用于赋值,== 用于比较
  • @camille 正是我的想法(太快了!),像df %&gt;% filter(!is.na(c)) %&gt;% group_by(a) %&gt;% filter(b == max(b)) 这样的东西似乎可读且简单。
  • @camille 抱歉,已澄清问题。一个组可能都是 NA,如果是这样,我仍然想要该组的记录。
  • 那会是什么记录,NA?
  • @camille 是的,已编辑示例。

标签: r dplyr


【解决方案1】:

根据更新后的示例,您可以标记 c 仅是 NA 的组以用作第二个过滤条件。为了便于说明,我将其写得比实际需要的更详细——例如,您可能不需要将all_na 保留为变量,只需在第一个filter 调用中进行内联计算即可。在这种情况下,修改我原来的过滤!is.na(c) 的建议,以匹配所有c 值都是NA 的或 种情况。

library(dplyr)

df %>%
  group_by(a) %>%
  mutate(all_na = all(is.na(c))) %>%
  filter(!is.na(c) | all_na) %>%
  filter(b == max(b))
#> # A tibble: 3 x 4
#> # Groups:   a [3]
#>       a     b c       all_na
#>   <dbl> <dbl> <chr>   <lgl> 
#> 1     1     2 HAM     FALSE 
#> 2     2    50 LOBSTER FALSE 
#> 3     3     3 <NA>    TRUE

【讨论】:

    【解决方案2】:

    这个怎么样:

    library(tidyverse)
    
    df %>%
      group_by(a) %>%
      filter(b == max(b),
             !is.na(c))
    

    【讨论】:

    • 添加了对使此答案无效的问题的说明。
    【解决方案3】:

    我们可以在按'a'分组后'c'中没有NA元素的'b'子集

    library(dplyr)
    df %>% 
        group_by(a) %>% 
         slice(if(all(is.na(c))) 1 else which.max(b[!is.na(c)]))
    # A tibble: 3 x 3
    # Groups:   a [3]
    #      a     b c      
    #  <dbl> <dbl> <chr>  
    #1     1     2 HAM    
    #2     2    50 LOBSTER
    #3     3     3 <NA>   
    

    【讨论】:

    • 添加了对使此答案无效的问题的说明。
    猜你喜欢
    • 2017-04-13
    • 2018-03-21
    • 1970-01-01
    • 1970-01-01
    • 2022-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-17
    相关资源
    最近更新 更多