подмножество фрейма данных с dplyr и условиями - PullRequest
1 голос
/ 16 мая 2019

У меня есть фрейм данных, например:

   Groups   Name    names2  Category    value
    G1  A   habit1  cat1    20
    G1  A   habit2  NA  1
    G1  B   habit3  NA  100
    G1  B   habit4  cat3    23
    G2  A   habit5  cat4    32
    G2  C   habit6  NA  100
    G2  C   habit7  cat2    21
    G2  D   habit8  cat3    34
    G2  D   habit9  cat5    43

, и я хотел бы сохранить только одну строку на Groups и на Name

и получить:

Groups  Name    names2  Category    value
G1  A   habit1  cat1    20
G1  B   habit4  cat3    23
G2  A   habit5  cat4    32
G2  C   habit7  cat2    21
G2  D   habit9  cat5    43

, где строка в Group и Name, которая побеждает, является строкой, в которой есть информация в names2 (не NA), и, если есть информация во всех, та, которая имеетнаибольшее значение выигрывает (as G2-D vs G2-D) 42 выигрыша, потому что 42 > 34 Если есть только NA, то в любом случае сохраняйте строку с лучшим значением.

Спасибо за помощь

1 Ответ

3 голосов
/ 16 мая 2019

Что вам нужно, это 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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...