【问题标题】:Summarise all using which on other column in dplyr [duplicate]在 dplyr 的其他列上总结所有使用 which [重复]
【发布时间】:2018-03-04 07:02:36
【问题描述】:

由于某种原因,我找不到使用 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 方法。

【问题讨论】:

    标签: r dplyr min


    【解决方案1】:

    对于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
    

    【讨论】:

    • 或者df %&gt;% arrange(D) %&gt;% distinct(A, .keep_all = TRUE) .. 我想。
    【解决方案2】:

    您需要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
    

    【讨论】:

      猜你喜欢
      • 2016-07-26
      • 2020-02-17
      • 1970-01-01
      • 2014-03-05
      • 2020-05-31
      • 2018-03-03
      • 2020-01-22
      相关资源
      最近更新 更多