代码之家  ›  专栏  ›  技术社区  ›  Tobias Dekker

总结dplyr中其他列中使用的所有内容[重复]

  •  1
  • Tobias Dekker  · 技术社区  · 7 年前

    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)])
    

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

    2 回复  |  直到 3 年前
        1
  •  3
  •   eipi10    7 年前

    您可以只筛选到最小值为的行 D 对于每个级别的 A . 下面的代码假设每个组中只有一个最小行。

    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
    
        2
  •  1
  •   Mike Stanley    7 年前

    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