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