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

时间:2017-09-22 16:18:30

标签: r dplyr min which

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

2 个答案:

答案 0 :(得分:3)

您可以向下搜索每个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

答案 1 :(得分:1)

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