Что вам нужно, это group_by
с filter
, а затем top_n
:
library(dplyr)
my.df %>%
group_by(Groups, Name) %>%
filter(!is.na(Category)) %>%
top_n(1, value)
# A tibble: 5 x 5
# Groups: Groups, Name [5]
# Groups Name names2 Category value
# <chr> <chr> <chr> <chr> <int>
# 1 G1 A habit1 cat1 20
# 2 G1 B habit4 cat3 23
# 3 G2 A habit5 cat4 32
# 4 G2 C habit7 cat2 21
# 5 G2 D habit9 cat5 43
Это, однако, исключит группы, в которых Категория отсутствует для всех записей этого Имени, комбинации групп и, если существует несколько максимальных значений, она сохраняет их все.
Данные
my.df <- structure(list(Groups = c("G1", "G1", "G1", "G1", "G2", "G2", "G2", "G2", "G2"),
Name = c("A", "A", "B", "B", "A", "C", "C", "D", "D"),
names2 = c("habit1", "habit2", "habit3", "habit4", "habit5", "habit6", "habit7", "habit8", "habit9"),
Category = c("cat1", NA, NA, "cat3", "cat4", NA, "cat2", "cat3", "cat5"),
value = c(20L, 1L, 100L, 23L, 32L, 100L, 21L, 34L, 43L)),
class = "data.frame", row.names = c(NA, -9L))