【问题标题】:R dplyr, distinct, unique combination of variables, with maximum value of thirdR dplyr,不同的,唯一的变量组合,最大值为第三
【发布时间】:2021-06-15 16:08:54
【问题描述】:

我很接近,但语法不正确。我正在尝试根据基于第三个最大值的两个变量(列)的唯一组合的选择来选择数据表的所有列。 MWE 的进展至今。谢谢。 J

library(dplyr)

dt1 <- tibble (var1 = c("num1", "num2", "num3", "num4", "num5"),
               var2 =  rep("A", 5),
               var3 = c(rep("B", 2), rep("C", 3)),
               var4 = c(5, 10, 3, 7, 19))

dt1 %>% distinct(var2, var3, max(var4),  .keep_all =  TRUE)

# A tibble: 2 x 5
  var1  var2  var3   var4 `max(var4)`
  <chr> <chr> <chr> <dbl>       <dbl>
1 num1  A     B         5          19
2 num3  A     C         3          19

这很接近,但我想要 var4 的值是最大值的行,在 var2 和 var3 的唯一组合内。我正在尝试获取:

# A tibble: 2 x 5
  var1  var2  var3   var4 `max(var4)`
  <chr> <chr> <chr> <dbl>       <dbl>
1 num2  A     B         5          10
2 num5  A     C         3          19

distinct 函数的第三个参数需要公式吗?

【问题讨论】:

    标签: r dplyr unique distinct


    【解决方案1】:

    我们可以在distinct之前添加一个arrange语句

    library(dplyr)
    dt1 %>%
         arrange(var2, var3, desc(var4)) %>%
         distinct(var2, var3, .keep_all = TRUE)
    

    -输出

    # A tibble: 2 x 4
      var1  var2  var3   var4
      <chr> <chr> <chr> <dbl>
    1 num2  A     B        10
    2 num5  A     C        19
    

    或者另一个选项是slice_max

    dt1 %>%
        group_by(var2, var3) %>%
        mutate(var4new = first(var4)) %>% 
        slice_max(order_by= var4, n = 1) %>% 
        ungroup
    

    -输出

    # A tibble: 2 x 5
      var1  var2  var3   var4 var4new
      <chr> <chr> <chr> <dbl>   <dbl>
    1 num2  A     B        10       5
    2 num5  A     C        19       3
    

    【讨论】:

      【解决方案2】:

      slice() 会做你想做的事。虽然你有 drop "var4" = 5, 3 (不确定这是否重要)?

       tibble (var1 = c("num1", "num2", "num3", "num4", "num5"),
          var2 =  rep("A", 5),
          var3 = c(rep("B", 2), rep("C", 3)),
          var4 = c(5, 10, 3, 7, 19)) %>% 
         group_by(var2, var3) %>% 
         slice(which.max(var4)) %>%
         ungroup()
      
      
      
      # A tibble: 2 x 4
        var1  var2  var3   var4
        <chr> <chr> <chr> <dbl>
      1 num2  A     B        10
      2 num5  A     C        19
      

      【讨论】:

        【解决方案3】:

        这行得通吗:

        library(dplyr)
        dt1 %>% group_by(var2, var3) %>% filter(dense_rank(desc(var4)) == 1)
        # A tibble: 2 x 4
        # Groups:   var2, var3 [2]
          var1  var2  var3   var4
          <chr> <chr> <chr> <dbl>
        1 num2  A     B        10
        2 num5  A     C        19
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-12-11
          • 1970-01-01
          • 1970-01-01
          • 2018-11-02
          • 1970-01-01
          • 2015-01-21
          相关资源
          最近更新 更多