我有以下数据框。我想更喜欢 dplyr 来解决这个问题。 对于每个区域,我想要至少两个值。值 > 4.0 是首选。
因此,对于区域 10,保留所有值(> 4.0)。对于区域 20,选择前两个值。对于区域 30 也是如此。
zone <- c(rep(10,4), rep(20, 4), rep(30, 4))
set.seed(1)
value <- c(4.5,4.3,4.6, 5,5, rep(3,7)) + round(rnorm(12, sd = 0.1),1)
df <- data.frame(zone, value)
> df
zone value
1 10 4.4
2 10 4.3
3 10 4.5
4 10 5.2
5 20 5.0
6 20 2.9
7 20 3.0
8 20 3.1
9 30 3.1
10 30 3.0
11 30 3.2
12 30 3.0
期望的输出如下
> df
zone value
1 10 4.4
2 10 4.3
3 10 4.5
4 10 5.2
5 20 5.0
6 20 3.1
7 30 3.1
8 30 3.2
我想过使用 top_n 但它为每个区域选择相同的数字。
最佳答案
您可以在top_n
中动态计算n
library(dplyr)
df %>% group_by(zone) %>% top_n(max(sum(value > 4), 2), value)
# zone value
# <dbl> <dbl>
#1 10 4.4
#2 10 4.3
#3 10 4.5
#4 10 5.2
#5 20 5
#6 20 3.1
#7 30 3.1
#8 30 3.2
关于r - 使用 dplyr 为不同组选择不同数量的 top_n,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60690844/