如何使用tidyverse过滤出仅具有某些组的最大值的行

gkn4icbw  于 2023-02-06  发布在  其他
关注(0)|答案(1)|浏览(128)

我有一个包含两列的 Dataframe ,如下所示:

V1   V2
1    10
1    56
1    72
1    37
2    59
2    29
2    105
2    93    
3    53
3    40
3    84
3     3
4    62
4    34
4    18
4    42
5    38
5    92
5    79
5    25

我想使用tidyverse删除包含V2中每个组V1 = 2和V1 = 5各自最大值的行。
因此,对于上面的 Dataframe ,我希望得到以下输出:

V1   V2
1    10
1    56
1    72
1    37
2    59
2    29
2    93
3    53
3    40
3    84
3     3
4    62
4    34
4    18
4    42
5    38
5    79
5    25

下面是创建 Dataframe 的代码:
df = data.frame(V1= rep(1:5, each=4), V2 = sample(1:100,20))

nxowjjhe

nxowjjhe1#

filter进行分组

library(dplyr)
df %>%
   group_by(V1) %>% 
   filter(!(V2 == max(V2) & V1 %in% c(2, 5))) %>%
   ungroup
  • 输出
# A tibble: 18 × 2
      V1    V2
   <int> <int>
 1     1    10
 2     1    56
 3     1    72
 4     1    37
 5     2    59
 6     2    29
 7     2    93
 8     3    53
 9     3    40
10     3    84
11     3     3
12     4    62
13     4    34
14     4    18
15     4    42
16     5    38
17     5    79
18     5    25

或使用data.table

library(data.table)
setDT(df)[df[, .(I = .I[!(.GRP %in% c(2, 5) & V2 == max(V2))]), V1]$I]

或者在base R中使用ave

subset(df, !(V1 %in% c(2, 5) & V2 ==ave(V2, V1, FUN = max)))
   V1 V2
1   1 10
2   1 56
3   1 72
4   1 37
5   2 59
6   2 29
8   2 93
9   3 53
10  3 40
11  3 84
12  3  3
13  4 62
14  4 34
15  4 18
16  4 42
17  5 38
19  5 79
20  5 25

数据

df <- structure(list(V1 = c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 3L, 3L, 
3L, 3L, 4L, 4L, 4L, 4L, 5L, 5L, 5L, 5L), V2 = c(10L, 56L, 72L, 
37L, 59L, 29L, 105L, 93L, 53L, 40L, 84L, 3L, 62L, 34L, 18L, 42L, 
38L, 92L, 79L, 25L)), class = "data.frame", row.names = c(NA, 
-20L))

相关问题