在 dplyr 的其他列上总结所有使用的内容

Summarise all using which on other column in dplyr

出于某种原因,我找不到使用 summarise_all 函数解决以下问题的解决方案:

df <- data.frame(A = c(1,2,2,3,3,3,4,4), B = 1:8, C = 8:1, D = c(1,2,3,1,2,5,10,9))

期望的结果:

df %>% 
    group_by(A) %>% 
    summarise(B = B[which.min(D)],
              C = C[which.min(D)],
              D = D[which.min(D)])
# A tibble: 4 x 4
      A     B     C     D
  <dbl> <int> <int> <dbl>
1     1     1     8     1
2     2     2     7     2
3     3     4     5     1
4     4     8     1     9

我尝试了什么:

df %>% 
    group_by(A) %>% 
    summarise_all(.[which.min(D)])

换句话说,我想按一个变量分组,并为每一列找到属于另一列的最小值的值。我无法使用 summarise_all 找到解决方案。我正在寻找 dplyr 方法。

对于 A 的每个级别,您可以只过滤到具有最小值 D 的行。下面的代码假定每一组中只有一个最小行。

df %>% 
  group_by(A) %>% 
  arrange(D) %>% 
  slice(1)
      A     B     C     D
1     1     1     8     1
2     2     2     7     2
3     3     4     5     1
4     4     8     1     9

如果可以有多行最小值 D,则:

df <- data.frame(A = c(1,2,2,3,3,3,4,4), B = 1:8, C = 8:1, D = c(1,2,3,1,2,5,9,9))

df %>% 
  group_by(A) %>% 
  filter(D == min(D))
      A     B     C     D
1     1     1     8     1
2     2     2     7     2
3     3     4     5     1
4     4     7     2     9
5     4     8     1     9

您需要 filter - 每当您尝试删除一些行并保留其他行时,这就是您想要的动词。

df %>% group_by(A) %>% filter(D == min(D))
#> # A tibble: 4 x 4
#> # Groups:   A [4]
#>       A     B     C     D
#>   <dbl> <int> <int> <dbl>
#> 1     1     1     8     1
#> 2     2     2     7     2
#> 3     3     4     5     1
#> 4     4     8     1     9