Присвоение максимального значения столбца, сгруппированного по другому столбцу, динамически в dplyr - PullRequest
0 голосов
/ 16 мая 2018

У меня есть фрейм данных, в котором я хотел бы назначить максимальные значения динамически именованного столбца, сгруппированного по другому статическому столбцу. Я думаю, что лучший способ представить мою проблему - это пример.

Предположим, у меня есть следующий фрейм данных, my.events:

           x        title typethx typesea
1 2016-11-24 Thanksgiving       1       0
2 2016-11-25 Thanksgiving       2       0
3 2016-11-26 Thanksgiving       3       0
4 2016-11-26       Season       0       1
5 2016-11-27       Season       0       2

Существует совпадение дат между двумя типами событий в 2016-11-26. Поэтому я хочу сгруппировать по моему столбцу x, а затем изменить столбцы type до максимальных значений.

В статической реализации это будет записано как:

my.events <- my.events %>%
  group_by(x) %>%
  mutate(typethx = max(typethx),
         typesea = max(typesea)) %>%
  ungroup()

Результат будет выглядеть так:

           x        title typethx typesea
1 2016-11-24 Thanksgiving       1       0
2 2016-11-25 Thanksgiving       2       0
3 2016-11-26 Thanksgiving       3       1
4 2016-11-26       Season       3       1
5 2016-11-27       Season       0       2

Однако я бы хотел динамически изменять мои столбцы type. Сначала я пытаюсь динамически изменить один столбец type. В этом случае, скажем, я хочу применить свой mutate к typethx, поэтому я создаю переменную name = "typethx". Теперь я попробовал метод SE, используя mutate_, а также метод lazyeval. Ни один из них не был успешным, что привело к ошибкам или неправильным выводам (мои попытки см. Ниже).

Попытка A:

new.events <- my.events %>%
  group_by(x) %>%
  mutate(!!name := max(!!name)) %>%
  ungroup()

Результат A:

           x        title typethx typesea
      <fctr>       <fctr>   <chr>   <dbl>
1 2016-11-24 Thanksgiving typethx       0
2 2016-11-25 Thanksgiving typethx       0
3 2016-11-26 Thanksgiving typethx       1
4 2016-11-26       Season typethx       1
5 2016-11-27       Season typethx       2

Попытка B:

new.events <- my.events %>%
  group_by(x) %>%
  mutate_(lazyeval::interp(~name = max(name), name = as.name(name))) %>%
  ungroup()

Результат B:

Error: unexpected '=' in "new.events <- my.events %>% group_by(x) %>% mutate_(lazyeval::interp(~name ="

Попытка C:

new.events <- my.events %>%
  group_by(x) %>%
  mutate_(lazyeval::interp(~name, name = as.name) = lazyeval::interp(~max(name), name = as.name(name))) %>%
  ungroup()

Результат C:

Error: unexpected '=' in "new.events <- my.events %>% group_by(x) %>% mutate_(lazyeval::interp(~name, name = as.name) ="

Попытка D:

new.events <- my.events %>%
  group_by(x) %>% mutate_(name = lazyeval::interp(~max(name), name = as.name(name))) %>%
  ungroup()

Результат D:

           x        title typethx typesea  name
      <fctr>       <fctr>   <dbl>   <dbl> <dbl>
1 2016-11-24 Thanksgiving       1       0     1
2 2016-11-25 Thanksgiving       2       0     2
3 2016-11-26 Thanksgiving       3       1     3
4 2016-11-26       Season       3       1     3
5 2016-11-27       Season       0       2     0

Бонусные баллы:

Я думал о том, чтобы пройтись по моим type колонкам и сделать мутации, но если есть способ мутировать их всех сразу, то это было бы здорово. Просто для предварительного знания, эти type столбцы были фиктивными переменными столбцами, которые я создал на предыдущем шаге. Ради сохранения масштаба проблемы, вы можете смело предположить, что есть переменная с именем dummy.cols = c('typethx', 'typesea').

1 Ответ

0 голосов
/ 16 мая 2018

Если нам нужно подать заявку на несколько столбцов, используйте mutate_at

my.events %>% 
     group_by(x) %>% 
     mutate_at(vars(starts_with("type")), max)
# A tibble: 5 x 4
# Groups:   x [4]
#   x          title        typethx typesea
#   <date>     <chr>          <dbl>   <dbl>
#1 2016-11-24 Thanksgiving       1       0
#2 2016-11-25 Thanksgiving       2       0
#3 2016-11-26 Thanksgiving       3       1
#4 2016-11-26 Season             3       1
#5 2016-11-27 Season             0       2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...