如何只保留在 R 的特定列中具有最高值的行

how to keep only rows that have highest value in certain column in R

我有一个如下所示的数据框:

library(tidyverse)

df <- tribble (
  ~Species, ~North, ~South, ~East, ~West,
  "a", 4, 3, 2, 3,
  "b", 2, 3, 4, 5, 
  "C", 2, 3, 3, 3,
  "D", 3, 2, 2, 2
)

我想筛选出最高值的物种,例如北。 在这种情况下,将选择物种 A 和 D。预期输出将是一个只有物种 A 和 D 的 df。 我使用了这样的解决方法:

df %>%
group_by(species) %>%
mutate(rowmean = mean(North:West) %>%
filter(North > rowmean) %>%
ungroup() %>%
select(!rowmean)

这似乎是一个简单任务的大量代码! 但是,我找不到一种更代码友好的方法。是否有一种(最好是 tidyverse)方法以更干净的方式执行此任务?

亲切的问候

更简单的方法是在 base R 中使用 max.col。 Select 数字列。获取值为 max 的每一行的列索引。检查它是否等于 1,即第一列(因为我们只从第二列开始选择)和 subset

subset(df, max.col(df[-1], 'first') == 1)
# A tibble: 2 x 5
#  Species North South  East  West
#  <chr>   <dbl> <dbl> <dbl> <dbl>
#1 a           4     3     2     3
#2 D           3     2     2     2

如果是基于rowwise mean

subset(df, North > rowMeans(df[-1]))

或者如果我们更喜欢使用 dplyr

library(dplyr)
df %>%
   filter(max.col(cur_data()[-1], 'first') == 1)

同样,如果它基于行平均

df %>% 
    filter(North > rowMeans(cur_data()[-1]))
# base
df[df$North > rowMeans(df[-1]), ]  
# A tibble: 2 x 5
  Species North South  East  West
  <chr>   <dbl> <dbl> <dbl> <dbl>
1 a           4     3     2     3
2 D           3     2     2     2