R dplyr,不同的,唯一的变量组合,最大值为第三

R dplyr, distinct, unique combination of variables, with maximum value of third

我很接近,但语法不正确。我正在尝试 select 数据的所有列 table 基于 select 两个变量(列)的唯一组合基于第三个变量的最大值。到目前为止的进展 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

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

# 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 函数的第三个参数的公式吗?

我们可以在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

这个有用吗:

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

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